我正在尝试使用复制构造函数创建一个非常简单的字符串类,我遇到的问题是我尝试将数据类型/对象作为常量发送,但每当我尝试将其分配给相同的非 - 常量数据,编译器抱怨。
我不明白为什么编译器会抱怨,我只是想复制数据,我不是修改它。
标题
class MyString{
private:
char* thestring;
MyString* ms;
public:
MyString();
MyString(const char* str);
MyString(const MyString& str);
~MyString();
MyString& operator=(const char* str);
};
CPP
MyString::MyString(){
thestring = '\0';
}
MyString::MyString(const MyString& str){
ms = str;
}
MyString& MyString::operator=(const char* str){
MyString* temp = new MyString();
temp->thestring = str;
return temp;
}
MyString::MyString(const char* str){
}
MyString::~MyString(){
}
这是错误:
“const MyString”到“MyString *”没有合适的转换函数 存在9
类型“const char *”的值不能分配给类型的实体 “char *”14
“MyString&”类型的引用(不是const限定的)不可能 使用“MyString *”15
类型的值初始化'MyString :: operator =':必须返回值16
答案 0 :(得分:2)
首先,您的班级中不需要ms
成员:它没有用处,只在您的(不正确的)复制构造函数中使用。删除ms
,并按如下所示重写代码:
MyString::MyString(const MyString& str) {
thestring = strdup(str.thestring);
}
请注意,现在您的代码违反了rule of three:添加复制构造函数后,您还需要匹配的赋值运算符和析构函数:
MyString& MyString::operator=(const MyString& str) {
if (this != &str) {
free(thestring);
thestring = strdup(str.thestring);
}
return *this;
}
MyString::~MyString() {
free(thestring);
}
最后,我会像这样重写你的默认构造函数:
MyString::MyString()
: thestring(0) {
}
基本上,这没有什么不同,但初始化列表更规范。
答案 1 :(得分:1)
第9行:ms
是MyString*
,但str
只是const MyString&
(即不是指针)。
第14行:您无法为const char*
分配char*
值,因为这可能会让您更改它:
void foo(const char* dont_change_this) {
char* s = dont_change_this;
s[0] = '!'; // you changed it!
}
第15行:再一次,一个简单的指针不匹配。 op =的返回类型为MyString&
,但temp
的类型为MyString*
。
答案 2 :(得分:0)
但是你不只是试图复制数据,而是试图剥夺它的常量。换句话说,您正在尝试使用const指针分配非const指针。这将使您能够潜在地更改您想要“const”的值。