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 <cstring>
。
如果您的班主任允许,最好使用std::array<char,MAX_NAME_LENGTH>
甚至std::string
。两者都可以通过赋值来复制。
【讨论】:
在头文件中?还是cpp? 包含在您的 cpp 顶部(在其他包含之前或之后)。strncpy(...)
而不是赋值。以上是关于C++ 表达式必须是可修改的左值的主要内容,如果未能解决你的问题,请参考以下文章