1

我创建了一个 myString 类,我正在尝试运行以下代码:

class myString{
    char* str;
    int len;

public:
    myString(char* str1 = " "){
        len = strlen(str1);
        str = new char[len+1];
        strcpy(str, str1);
    };

    int getLen() const {
        return len;
    };

    char* getString() const {
        return str;
    };

    ~myString(){
        delete[] str;
    };

    myString& operator=(myString& orig){
        cout << "hello";
        if (str == NULL){
            delete[] str;
        };
        str = new char[orig.getLen()];
        strcpy(str, orig.getString());
        cout << this << endl;
        return *this;
    };

    ...
};



int main(){


    myString s("bla");
    myString k("dingo");
        myString g = s;
        // s=k;  //When this line is commented I get a linking error
         ...
   };

我的问题:

  1. 为什么“你好”没有被打印出来?
  2. 为什么该行s=k会导致链接器错误?

这是错误:

LINK : c:\users\perry\documents\visual studio 2010\Projects\inheritance\Debug\inheritance.exe 未找到或未由最后一个增量链接构建;执行完整链接 1>main.obj : 错误 LNK2019: 无法解析的外部符号 "class std::basic_ostream > & __cdecl operator<<(class std::basic_ostream

&,class myString *)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@PAVmyString@@@Z) 在函数 "public: class myString & __thiscall myString ::operator=(class myString &)" (??4myString@@QAEAAV0@AAV0@@Z) 1>c:\users\perry\documents\visual studio 2010\Projects\inheritance\Debug\inheritance.exe:致命错误LNK1120:1 个未解决的外部因素

谢谢,李

4

5 回答 5

3

对于以下内容,您需要一个复制构造函数。它不使用赋值运算符功能。

myString g = s;

编辑

对于链接器错误 - 我无法帮助您。与其猜测operator<<该行调用什么,我将放弃这一点,因为您尚未提供代码。在普通的 C++ 代码中,简单的代码cout << this;不会导致链接器错误。cout有一个接受 avoid const*为此的运算符。您在某处声明了一个提供更好匹配但未定义它的运算符。

于 2010-09-03T21:05:00.537 回答
1

链接错误是你没有定义

operator<<(class std::basic_ostream< >  &,class myString *)

由于线路

cout << this << endl;
于 2010-09-03T21:16:22.127 回答
0

我认为应该是

operator=(const myString &orig)
于 2010-09-03T21:05:56.753 回答
0
myString g = s;

这不调用 operator=,而是调用复制构造函数。由于您尚未定义任何复制构造函数,因此会生成一个默认构造函数,复制所有字段。但是你拿着指针,你不希望这种情况发生!这就是为什么你需要一个复制构造函数。

关于链接错误:

cout << this << endl;

在这里,您尝试使用operator<<它。this 的类型是myString*,未定义 this 运算符。如果要打印 this 指针的值,可以转换:

cout << (void*) this << endl;



 if (str == NULL){
                delete[] str;
            };

你想if (str != NULL)在这里(错字?)。

于 2010-09-03T21:06:30.140 回答
0

首先,myString g = s;是 new 的初始化,myString这是通过复制构造函数完成的(它是自动提供的,因为您没有编写一个)。

链接错误是因为线路cout << this << endl;,因为你没有告诉系统如何打印this,它显然无法想出办法。

在 C++ 中,存在三法则:如果您编写复制构造函数、赋值运算符或析构函数,您可能需要编写所有三个。(例外是为基类编写虚拟析构函数。)通常,您的类管理一些资源(str在您的情况下),您需要在所有三种情况下处理它。

此外,尽可能使用const。您可以将非const变量传递给const引用,但反之则不行。

你的析构函数很好。您的赋值运算符应该有签名myString & operator=(const &myString),并且您的复制构造函数应该有签名myString::myString(const &myString)

于 2010-09-03T21:19:11.137 回答