【问题标题】:How to use the copy constructor with pointer member fields?如何将复制构造函数与指针成员字段一起使用?
【发布时间】:2021-02-14 16:02:55
【问题描述】:

在使用指针和复制对象时,这是解决复制构造函数问题的一个不错的解决方案吗?

Person(const Person& source) {
    if (source.agePtr != nullptr) {
        agePtr = new int(*source.agePtr);
    }
}

我只是想确保我处理不复制前一个对象地址的指针的方式是正确的。它确实解决了问题,但我只想从其他在 C++ 方面更有经验的人那里了解我的处理方式是否正确和良好的做法。我来自 C#,所以这种东西对我来说很新鲜。

Person person1{ 91 };
Person person2{ person1 };
std::cout << "Person2 before person1 change: " << person2.GetAgePtr()<< "\n";
person1.ChangePtr(1);  // change fist object
std::cout << "Person2 After person1 change: " << person2.GetAgePtr()<< "\n";

【问题讨论】:

  • 最直接的解决方案是根本不使用原始指针。
  • 如果你问如何测试一个复制构造函数是否正在处理一个对象,那么是的。您更改源并检查副本不会更改。
  • 请说明您是否真的需要一个指针,或者一个 int 是否足以满足您的需要。

标签: c++ copy-constructor


【解决方案1】:

是的,这就是你的做法。

我不知道我上次存储指向 int 的指针是什么时候,但您只是将它用作示例(我希望如此)。但是,在现代 C++ 中,您可以开始摆脱几乎所有原始指针,转而使用智能指针:

#include <memory>

class Person {
private:
    std::shared_ptr<MyOtherObject> myOtherObject;
    ...
};

你像这样创建一个共享指针:

myOtherObject = std::make_shared<MyOtherObject();

如果有对应的构造函数,你可以给它添加参数。

您可以像使用指针一样使用它们,但是当您完成后,您不必释放它们。它们是智能指针。它们像魔术一样工作。

请注意循环引用。

【讨论】:

  • 谢谢。是的,这只是一个简单的例子。而且我听说过智能指针,但我不屑一顾地研究它。我已经使用 c++ 几天了,现在有很多东西要学。但再次感谢您花时间解释。
【解决方案2】:

如果你真的需要使用原始指针,你应该怎么做。您可以使用成员列表初始化和三元运算符 (condition? true statement : false statement) 优化您的代码:

Person(const Person& p)
: agePtr(p.agePtr!=nullptr? new int(*p.agePtr) : nullptr) 
{}

但是,在使用原始指针时,不要忘记删除agePtr,否则会泄漏内存。因此,您应该考虑使用智能指针,例如shared_ptrunique_ptr

【讨论】:

  • 是的,我通过析构函数删除了它。并且智能指针部分肯定会调查。并感谢您提供有关成员初始化部分的提示。
猜你喜欢
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 2016-04-13
相关资源
最近更新 更多