簡體   English   中英

如何將復制構造函數與指針成員字段一起使用?

[英]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_ptrunique_ptr

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM