C++ 运算符重载

C++ 运算符重载,c++,operator-overloading,operator-keyword,C++,Operator Overloading,Operator Keyword,我创建了一个类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;

我创建了一个类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
         ...
   };
我的问题是:

为什么hello没有打印出来? 为什么行s=k会导致链接器错误? 这就是错误:

链接:c:\users\perry\documents\visual studio 2010\Projects\heritation\Debug\heritation.exe未找到或未生成 通过最后一个增量链接;正在执行完整链接1>main.obj:错误 LNK2019:未解析的外部符号类 标准::基本的_ostream>和u cdecl
运算符对于以下内容,您需要一个复制构造函数。它不使用赋值运算符功能

myString g = s;
编辑


对于链接器错误-我不能帮你。您需要一个复制构造函数,而不是猜测下面的运算符。它不使用赋值运算符功能

myString g = s;
编辑

对于链接器错误-我不能帮你。我认为应该是哪个操作符,而不是猜测

operator=(const myString &orig)
我想应该是这样

operator=(const myString &orig)
这不调用运算符=,而是调用复制构造函数。由于您尚未定义任何复制构造函数,因此会生成一个默认构造函数,复制所有字段。但你拿着指针,你不想发生这种事!这就是为什么你需要一个复制构造函数。 关于链接错误:

cout << this << endl;
如果str!=此处输入错误为空

这不调用运算符=,而是调用复制构造函数。由于您尚未定义任何复制构造函数,因此会生成一个默认构造函数,复制所有字段。但你拿着指针,你不想发生这种事!这就是为什么你需要一个复制构造函数。 关于链接错误:

cout << this << endl;

如果str!=此处输入错误为空?

链接错误是您尚未定义

operator<<(class std::basic_ostream< >  &,class myString *)
由于线路原因

cout << this << endl;

链接错误是您尚未定义

operator<<(class std::basic_ostream< >  &,class myString *)
由于线路原因

cout << this << endl;
首先,myString=s;是一个新myString的初始化,这是通过复制构造函数完成的,复制构造函数是自动提供的,因为您没有编写

链接错误首先是因为行cout,myString=s;是一个新myString的初始化,这是通过复制构造函数完成的,复制构造函数是自动提供的,因为您没有编写



链接错误是因为行cout@pm100生成了默认的链接。我将添加复制构造函数。知道链接错误吗?那么当g=s执行时会发生什么?为什么编译器对s=k的处理不同?@pm100默认值为generatedThanks。我将添加复制构造函数。知道链接错误吗?那么当g=s执行时会发生什么?为什么编译器对s=k的处理不同?我已经添加了错误消息。谢谢你的帮助:你需要查一下三四法则。无论如何,需要一个正确的赋值运算符和复制构造函数。复制构造函数缺失,赋值运算符声明不是我所说的标准,并且在len中,由于一个错误,实现存在缺陷。当你在看它的时候,查一下复制和交换idium。我已经添加了错误消息。谢谢你的帮助:你需要查一下三四法则。无论如何,需要一个正确的赋值运算符和复制构造函数。复制构造函数缺失,赋值运算符声明不是我所说的标准,并且在len中,由于一个错误,实现存在缺陷。当你在看它的时候,查阅副本并交换idium。呜呼!!!谢谢,那空虚拯救了我的夜晚。非常感谢你。由于某种原因,当我看到这些链接错误时,我会发疯。我必须开始更仔细地阅读它们。谢谢顺便说一下,空检查是不必要的。删除NULL或delete[]NULL是定义明确且合法的。什么也没发生。而且,在函数块或条件if块的末尾不需要分号——当然,只在类和结构定义和语句之后!呜呼!!!谢谢,那空虚拯救了我的夜晚。非常感谢你。由于某种原因,当我看到这些链接错误时,我会发疯。我必须开始更仔细地阅读它们。谢谢顺便说一下,空检查是不必要的。删除NULL或delete[]NULL是定义明确且合法的。什么也没发生。而且,在函数块或条件if块的末尾不需要分号——当然,只在类和结构定义和语句之后!有趣的是,它可以编译但无法链接。我本以为它会无法编译不确定它是否只是MSVC,但如果它作为默认定义未知,则通常需要首先使用方法,这可能会隐藏使用未定义内容的编译问题。有趣的是,它可以编译,但无法链接。我原以为它会无法编译不确定它是否只是MSVC,但如果方法作为默认定义未知,则通常需要首先使用该方法,因为默认定义可以隐藏使用未定义内容的编译问题。