我正在尝试使用复制构造函数创建一个非常简单的字符串类,我遇到的问题是我试图将数据类型/对象作为常量发送,但是每当我尝试将其分配给相同的非常量数据时,编译器抱怨。

我不明白为什么编译器会抱怨,我只是试图复制数据,我没有修改它。

header

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(){
}

这是错误:

最佳答案

首先,您无需在类中使用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) {
}

本质上,这没有什么不同,但是初始化列表更为规范。

关于c++ - 常量数据类型不能分配为非常量数据类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20277585/

10-13 06:28
查看更多