我为我的一个
指针数据成员编写了复制构造函数class person
{
public:
string name;
int number;
};
class MyClass {
int x;
char c;
std::string s;
person student;
MyClass::MyClass( const MyClass& other ) :
x( other.x ), c( other.c ), s( other.s ),student(other.student){}
};
但是当我运行此程序时出现以下错误
错误:成员'MyClass'[-fpermissive]的额外资格'MyClass ::' 我是否正确使用了复制构造函数。
答案 0 :(得分:2)
MyClass::MyClass( const MyClass& other )
^^^^^^^^^^
只有在类定义之外定义主体时,才需要完全限定名称。它告诉编译器这个特定的函数(恰好是你的情况下的构造函数)属于名称限定类。
在类定义中定义主体时,暗示该函数是您定义它的类的成员,因此不需要完全限定名称。
答案 1 :(得分:0)
class person
{
public:
string name;
int number;
};
class MyClass {
int x;
char c;
std::string s;
person *student;
MyClass(const MyClass& other);
};
MyClass::MyClass( const MyClass& other ) :
x( other.x ), c( other.c ), s( other.s ),student(other.student){
x = other.x;
c = other.c;
s = other.s;
student = other.student;
}
现在编译好了。我仍然怀疑,我是否正确地进行了明确的复制构造函数和赋值操作。?
答案 2 :(得分:0)
如果您想要浅拷贝,(所有MyClass
个实例都指向student
的同一副本),请执行以下操作:
MyClass::MyClass( const MyClass& other ) :
x( other.x ), c( other.c ), s( other.s ), student( other.student ) {}
否则,您需要深度复制,这是以这种方式实现的(注意取消引用):
MyClass::MyClass( const MyClass& other ) :
x( other.x ), c( other.c ), s( other.s ) {
student = new person(*(other.student)); // de-reference is required
}
运行以下代码以查看差异:
MyClass a;
person mike;
mike.name = "Mike Ross";
mike.number = 26;
a.student = &mike;
MyClass b(a);
b.student->number = 52;
cout << a.student->number << endl;
cout << b.student->number << endl;
浅拷贝输出:
52
52
深拷贝输出:
26
52