C++ 表达式必须是可修改的左值

Posted

技术标签:

【中文标题】C++ 表达式必须是可修改的左值【英文标题】:C++ Expression must be a modifiable lvalue 【发布时间】:2015-02-03 16:17:20 【问题描述】:

为我的 c++ 类编写这个程序,我遇到了一个问题。我的程序读取输入的名称并将其存储到name 然后它想检查_name 下的正确参数.. 这是我的类及其头文件。

我的错误特别是在::setName 下,我想在::display() 下检查或使用_name 设置我输入的名称以获得正确的输出

电话号码.cpp

using namespace oop244;


    void PhoneNumber::display() const
        cout << "name: " << _name << ", Phone number: (" << _areacode << ") " << _localNumber / 10000 << "-" << _localNumber % 10000 << endl;
    

    bool PhoneNumber::isValid() const
    
        if (correctNum == false && correctArea == false)
            cout << _name << " does not have a valid phone number." << endl;
            return false;
        
        else
            return true;
        

    
    void PhoneNumber::setName(const char name[])
    
        cout << name << endl;

        _name = name;
    

电话号码.h

#define MAX_NAME_LENGTH 40
#define PHNO_MAX  999999
#define PHNO_MIN 100000
#define AREACODE_MIN 100
#define AREACODE_MAX  999
namespace oop244

    class PhoneNumber


    private:
        char _name[MAX_NAME_LENGTH + 1];
        int _areacode;
        int _localNumber;
        bool _validPhoneNumber;
    public:

        void setName(const char name[]);
        void setPhoneNumber(int areaCode, int number);
        void display() const;
        bool isValid() const;


    ;
;

【问题讨论】:

无法分配内置数组。使用strncpy 或类似名称,或者干脆使用std::string 如果可以的话,一定要使用 std::string 而不是 C 风格的字符串。我还建议摆脱 #define 常量以支持 const 常量,例如const auto MAX_NAME_LENGTH = 40; 【参考方案1】:

使用标准字符串

#include <string>

并使用

std::string _name;

在你的类声明中而不是

char _name[MAX_NAME_LENGTH + 1];

按照另一个答案的建议,或者使用 c 样式的 str 函数

【讨论】:

基本上,每个char[] 都应该替换为std::string。在参数中也是如此,在成员中也是如此。 有些班主任对可以使用的类型做了限制。这就是为什么您还应该为std::string 无法 使用的情况提供解决方案。 同意,但是OP说是针对一个类的,而且大部分类对使用什么都有特定的限制(例如,如果允许使用@987654327,你就不能学习如何编写链表@为此...)【参考方案2】:

您不能分配原始数组。您需要复制内容。

假设你的班主任强迫你使用字符数组,你可以例如使用strncpy来复制字符:

strncpy(_name, name, MAX_NAME_LENGTH);

为此,您需要#include &lt;cstring&gt;

如果您的班主任允许,最好使用std::array&lt;char,MAX_NAME_LENGTH&gt; 甚至std::string。两者都可以通过赋值来复制。

【讨论】:

在头文件中?还是cpp? 包含在您的 cpp 顶部(在其他包含之前或之后)。 strncpy(...) 而不是赋值。

以上是关于C++ 表达式必须是可修改的左值的主要内容,如果未能解决你的问题,请参考以下文章

C 错误:表达式必须是可修改的左值

为啥我得到的表达式必须是可修改的左值?

指向函数指针的指针 - 表达式必须是可修改的左值

表达式必须是可修改的左值(字符数组)

错误:表达式必须是可修改的左值

循环中分配的多维数组说明:表达式必须是可修改的左值