2012-07-19 104 views
1

我有一个类:C++(逻辑复制构造函数)如何复制对象?

class Person{ 
public: 
    Person(); 
    ~Person(); 
    string name; 
    int* age; 
}; 

int main() 
{ 
    Person* personOne = new Person; 
    personOne->name = "Foo"; 
    personOne->age = new int(10); 


    return 0; 
} 

如何创建人物的另一个目的,所有副本personOne数据?年龄指针需要指向一个新的int,所以每当ageOne或personTwo中的年龄发生变化时,它就不会相互影响。

+3

我希望这是一个纯粹的学术问题,你永远不会写这样的真实代码。 – 2012-07-19 14:00:11

+0

别担心,你还没有看到我的“真正的”程序;)它不是这样的。这只是我所做的一个代码示例。如果这是我真正的代码,我会有一个正确的构造函数,正确地分配变量,删除指针等等(甚至不会使用指针来代表年龄lol) – Danny 2012-07-19 14:03:32

+0

No:如果你有一个真正的程序,它不应该有指针或“新”的! :-) – 2012-07-19 14:30:28

回答

3

有两种posibilites:

  • 拷贝构造函数+赋值操作符
  • clone方法

代码:

class Person{ 
public: 
    Person(); 
    ~Person(); 
    Person (const Person& other) : name(other.name), age(new int(*(other.age))) 
    { 
    } 
    Person& operator = (const Person& other) 
    { 
     name = other.name; 
     delete age; //in case it was already allocated 
     age = new int(*(other.age)) 
     return *this; 
    } 
    //alternatively 
    Person clone() 
    { 
     Person p; 
     p.name = name; 
     p.age = new int(age); 
     return p; 
    } 

    string name; 
    int* age; 
}; 

回答这些问题,然后前进:

  • 你真的需要一个int指针吗?
  • 你知道智能指针吗?
  • 你是否释放了你分配的所有内存?
  • 你是否初始化构造函数中的所有成员?
+0

感谢您的例子。我可以问的是复制构造函数+赋值运算符还是克隆方法? – Danny 2012-07-19 13:52:08

+0

您忘记在赋值运算符中清理为this-> age分配的内存。 – 2012-07-19 13:52:59

+0

@AnonMail你是对的。 – 2012-07-19 13:53:36