0

我已经为我的一个类的指针数据成员编写了复制构造函数

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::' 我是否正确使用了复制构造函数。

4

3 回答 3

2
MyClass::MyClass( const MyClass& other )
^^^^^^^^^^

仅当您在类定义之外定义主体时,才需要完全限定名称。它告诉编译器这个特定的函数(在你的例子中恰好是构造函数)属于名称限定类。
当您在类定义中定义主体时,暗示该函数是您定义它的类的成员,因此不需要完全限定名称。

于 2013-02-20T06:45:52.950 回答
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;
 }

它现在编译得很好。我仍然有一个疑问,我是否正确地执行了显式复制构造函数和赋值操作。?

于 2013-02-20T06:58:33.913 回答
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
于 2013-02-20T10:39:22.327 回答