[英]How to use the copy constructor with pointer member fields?
在使用指針和復制 object 時,這是否是解決復制構造函數問題的一個不錯的解決方案。
Person(const Person& source) {
if (source.agePtr != nullptr) {
agePtr = new int(*source.agePtr);
}
}
我只是想確保我如何處理不復制以前的 object 地址的指針是正確的方法。 它肯定可以解決問題,但我只想從其他在 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++ 下,您可以開始擺脫幾乎所有原始指針並轉而使用智能指針:
#include <memory>
class Person {
private:
std::shared_ptr<MyOtherObject> myOtherObject;
...
};
您可以像這樣創建一個共享指針:
myOtherObject = std::make_shared<MyOtherObject();
如果有相應的構造函數,您可以將 arguments 添加到其中。
您可以像使用指針一樣使用它們,但是當您完成后,您不必釋放它們。 它們是智能指針。 他們像魔術一樣工作。
請注意循環引用。
如果你真的需要使用原始指針,你如何做到這一點是 go 的方法。 您可以使用成員列表初始化和三元運算符( condition? true statement: false statement
)優化您的代碼:
Person(const Person& p)
: agePtr(p.agePtr!=nullptr? new int(*p.agePtr) : nullptr)
{}
但是,在使用原始指針時,不要忘記刪除agePtr
,否則會泄漏 memory。 因此,您應該考慮使用智能指針,例如shared_ptr
或unique_ptr
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.