C++ 运算符重载
我创建了一个类myString,并尝试运行以下代码: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;
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,但如果方法作为默认定义未知,则通常需要首先使用该方法,因为默认定义可以隐藏使用未定义内容的编译问题。