C++ 复制构造函数未调用(编译错误)
C++ copy constructor is not invoking (compilation error)
这段代码编译不通过(请忽略operator+中的传值,我可以通过引用替换它&但它仍然没有解决问题)
我希望在主要功能中:
String s3 = s + s2; // COMPILATION ERROR
编译正常(因为我声明了复制构造函数)但它给出了错误 ("no matching constructor")
#include <iostream>
#include <string>
class String {
public:
String()
{
std::cout << "Constructor " << this << std::endl;
data = new char[100];
};
String(char * str) : String()
{
std::cout << "Char * Constructor " << this << std::endl;
strcpy(this->data,str);
};
String(String & rhs) : String() {
std::cout << "Copy Constructor " << this << std::endl;
strcpy(data, rhs.data);
};
void print() {
printf("%s\n",data);
}
~String() {
std::cout << "Destructor " << this << std::endl;
if (data) {
delete data;
data = nullptr;
}
};
friend String operator+(String s1, String s2);
private:
char * data;
};
String operator+(String s1, String s2)
{
String temp;
delete [] temp.data;
temp.data =
new char[strlen(s1.data) + strlen(s2.data) + 1];
strcpy(temp.data, s1.data);
strcat(temp.data, s2.data);
return temp;
}
int main(int argc, const char * argv[])
{
String s("herer");
s.print();
String s2 = s;
s2.print();
String s3 = s + s2; // COMPILATION ERROR
return 0;
}
拷贝构造函数的参数必须是const&
.
String(String const & rhs) : String() { ... }
您的代码有几个错误。第一
String(char * str)
需要
String(const char * str)
如果您想像在 main()
和 String s("herer");
中那样使用字符串文字。其次你的拷贝构造函数
String(String & rhs)
需要参加
String(const String & rhs)
以便它可以绑定到临时文件。
第三,您需要包含 <cstring>
或 <string.h>
才能使用 strcpy()
。
最后,您在析构函数中使用了错误的 delete
。当您调用 new
时,您使用 delete
,当您使用 new[]
时,您调用 delete []
。您使用 new[]
分配 data
但您正在使用 delete
.
删除它
您可以查看代码的工作示例 here
这段代码编译不通过(请忽略operator+中的传值,我可以通过引用替换它&但它仍然没有解决问题) 我希望在主要功能中:
String s3 = s + s2; // COMPILATION ERROR
编译正常(因为我声明了复制构造函数)但它给出了错误 ("no matching constructor")
#include <iostream>
#include <string>
class String {
public:
String()
{
std::cout << "Constructor " << this << std::endl;
data = new char[100];
};
String(char * str) : String()
{
std::cout << "Char * Constructor " << this << std::endl;
strcpy(this->data,str);
};
String(String & rhs) : String() {
std::cout << "Copy Constructor " << this << std::endl;
strcpy(data, rhs.data);
};
void print() {
printf("%s\n",data);
}
~String() {
std::cout << "Destructor " << this << std::endl;
if (data) {
delete data;
data = nullptr;
}
};
friend String operator+(String s1, String s2);
private:
char * data;
};
String operator+(String s1, String s2)
{
String temp;
delete [] temp.data;
temp.data =
new char[strlen(s1.data) + strlen(s2.data) + 1];
strcpy(temp.data, s1.data);
strcat(temp.data, s2.data);
return temp;
}
int main(int argc, const char * argv[])
{
String s("herer");
s.print();
String s2 = s;
s2.print();
String s3 = s + s2; // COMPILATION ERROR
return 0;
}
拷贝构造函数的参数必须是const&
.
String(String const & rhs) : String() { ... }
您的代码有几个错误。第一
String(char * str)
需要
String(const char * str)
如果您想像在 main()
和 String s("herer");
中那样使用字符串文字。其次你的拷贝构造函数
String(String & rhs)
需要参加
String(const String & rhs)
以便它可以绑定到临时文件。
第三,您需要包含 <cstring>
或 <string.h>
才能使用 strcpy()
。
最后,您在析构函数中使用了错误的 delete
。当您调用 new
时,您使用 delete
,当您使用 new[]
时,您调用 delete []
。您使用 new[]
分配 data
但您正在使用 delete
.
您可以查看代码的工作示例 here