簡體   English   中英

在其構造函數中創建對象本身(this)的智能指針

[英]Creating Smart pointer of the object itself (this) in its constructor

所以可以說我有

class A
{

    A(std::vector<std::shared_pointer<A>> &a_vec)
    {
        auto shared_ptr = std::make_shared<A>(*this);
        a_vec.pushback<shared_ptr>;
    {
};
class B
{
std::vector<std::shared_pointer<A>> a_vector_;
    void constructA()
    {
        created_A = make_shared<A>(a_vector_);
    }
}

因此,我為 B 創建了一個方法,該方法創建了一個 A,並且 A 將自身推向 B 提供的向量。

在紙面上,這種依賴關系就像我預期的那樣工作,至少我認為直到我意識到a_vec.pushback<this*>; 不是很可靠。

當我在推送和共享指針初始化之間有更多代碼時

    A(std::vector<std::shared_pointer<A>> a_vec)
    {
        auto shared_ptr = std::make_shared<A>(*this);
        
        //insert more code here

        a_vec.pushback<shared_ptr>;
    {

似乎我在那里所做的初始化和其他事情並沒有反映到共享指針指向的指針上。 這是什么原因,有沒有辦法解決它? 還有一個原因,這將是一個不好的做法?

使用 C++ 編程時的挑戰之一是理解對象的生命周期。 所以最好讓對象的創建和銷毀盡可能的清晰。

據我了解,您的情況是“自動”記住所有創建的對象。 使用“工廠方法”constructA 更容易

#include <iostream>
#include <vector>
#include <memory>


class A
{
public:
    A() = default;
};

class B//AInstanceFactory - is a better name
{
    std::vector<std::shared_ptr<A>> a_instances;

public:
    void constructA()
    {
        a_instances.push_back(std::make_shared<A>());
    }

    const std::vector<std::shared_ptr<A>>& getAInstances() {
        return a_instances;
    }
};

int main()
{
    B b;

    b.constructA();

    std::cout << b.getAInstances().size() << "\n";

    b.constructA();

    std::cout << b.getAInstances().size() << "\n";
}


[錯誤路徑] 可以使對象知道 shared_ptr/weak_ptr:使用模板 std::enable_shared_from_this。 在這種情況下,您的代碼可能如下:

#include <iostream>
#include <vector>
#include <memory>


class A : std::enable_shared_from_this<A>
{
public:
    A(std::vector<std::shared_ptr<A>>& a_vec)
    {
        a_vec.push_back(shared_from_this());//bad_weak_ptr here!!!!
    }
};

class B
{
    std::vector<std::shared_ptr<A>> a_vector_;

public:
    void constructA()
    {
        auto a_ptr = make_shared<A>(a_vector_);
    }


    const std::vector<std::shared_ptr<A>>& getAVec() {
        return a_vector_;
    }

};

int main()
{
    B b;

    b.constructA();

    std::cout << b.getAVec().size() << "\n";
}

但它錯了,因為底層的 weak_ptr 只有在函數make_shared執行后才“准備好”,這意味着只有在構造調用之后。 調用shared_from_thisweak_from_this只有在make_shared函數執行后才有效。

暫無
暫無

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

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