在C ++中深度复制动态分配的对象

时间:2014-10-23 16:34:07

标签: c++ memory dynamic allocation

大家好,我找不到为动态分配的对象构建正确的复制构造函数的方法。它大喊:error: no matching function for call to 'Person::(Person*&')

我的测试代码是:

#include <iostream>
#include <cstring>

class Person
{
private:
    int* age;
    std::string name;
public:
    Person(std::string name_in, int age_in);
    Person(const Person& other);
    ~Person();
    void printAge();
    void printName();
};

Person::Person(std::string name_in, int age_in)
{
    std::cout << "Creating person named " << name_in << std::endl;
    name = name_in;
    age = new int;
    *age = age_in;
}
Person::Person(const Person& other)
{
    std::cout << "Copying person." << std::endl;
    age = new int;
    *age = *other.age;
    name = other.name;
}
Person::~Person()
{
    std::cout << "Freeing memory!" << std::endl;
    delete age;
}

void Person::printAge()
{
    std::cout << "The age is " << *age << std::endl;
}

void Person::printName()
{
    std::cout << "The name is " << name << std::endl;
}


int main()
{
    Person* person1 = new Person("Ramon", 19);
    person1->printAge();
    person1->printName();

    Person* person2 = new Person(person1);
    person2->printAge();
    person2->printName();

    delete person1;
    delete person2;

    return 0;
}

似乎当创建person2对象时,它只是指向person1的指针,但它不是!我声明它是一个新的动态分配对象:Person* person1 = new Person("Ramon", 19);。知道这可能是什么原因吗?

感谢。

3 个答案:

答案 0 :(得分:7)

复制构造函数通过引用而不是指针来获取输入参数。

改变这个:

Person* person2 = new Person(person1);

对此:

Person* person2 = new Person(*person1);

答案 1 :(得分:1)

确保也要编写自己的赋值运算符。它类似于复制构造函数,但除了内容的深层复制外,它还返回对调用对象的引用。

答案 2 :(得分:1)

已定义的复制构造函数是

人(const人及其他人)

此方法签名接受对person对象的引用,因此您需要发送引用。

在您发送 person1 的代码中,这是由新运营商分配的指针。

如果你想从另一个对象的指针复制一个对象而不是你应该制作这样的方法。

Person::Person(const Person *other)
{
    std::cout << "Copying person." << std::endl;
    age = new int;
    *age = *other->age;
    name = other->name;
}

但这不是复制构造函数通常具有的方法签名,也不会在

等情况下复制

人p2 = person1;