2017-02-10 78 views
-2

說我有一個類似於此的類。C++指針的行爲不如預期

class Actor { 
public: 
    add() 
    { 
     auto tmp = std::make_shared<actor>(); 
     actorListPtr.push_back(tmp); 
    } 

    static std::vector<shared_ptr<Actor>> & actorListPtr; 
} 

我希望通過這是有一個鏈接到一個單獨的載體,與類的每個單獨的實例相同的行爲的載體,從另一個來源引用。源中所做的任何更改都將反映在其指針上,反之亦然。例如。

std::vector<shared_ptr<Actor>> actorList; 
Actor::actorListPtr = actorList; 

Actor guy; 
guy.add(); 

應的actorListPtr等於內容actorList。但是,對我而言,情況並非如此。我錯過了什麼?

+3

_ 「我缺少什麼?」 _好的初學者的書。 –

+2

@πάνταῥεῖ我相信你的意思是[鏈接到圖書指南](http://stackoverflow.com/q/388242/1171191)。 – BoBTFish

回答

0

我希望通過這是有一個鏈接到一個單獨的載體,與類的每個單獨的實例相同的行爲的載體,從另一個來源引用。源中所做的任何更改都將反映在其指針上,反之亦然。

您似乎在踩高級C++主題。這有一個設計模式。它被稱爲Dependency Injection

以下是使其工作的一種方法。

class Actor { 
    public: 
     void add() 
     { 
     auto tmp = std::make_shared<Actor>(); 
     if (actorListPtr) 
     { 
      actorListPtr->push_back(tmp); 
     } 
     } 

     // Allow client code to inject a pointer to be used on subsequent 
     // calls to add(). 
     static void setActorList(std::vector<std::shared_ptr<Actor>>* newActorListPtr) 
     { 
     actorListPtr = newActorListPtr; 
     } 

    private: 
     static std::vector<std::shared_ptr<Actor>>* actorListPtr; 
} 

// The static member variable is initialized to nullptr. 
// Client code sets the value. 
std::vector<std::shared_ptr<Actor>>* Actor::actorListPtr = nullptr; 

// Client code. 

std::vector<shared_ptr<Actor>> actorList; 
Actor::setActorList(&actorList); 

Actor guy; 
guy.add(); 
+0

你的'''actorListPtr'''初始化給我一個編譯器錯誤,你確定你不是指''std :: vector > * Actor :: actorListPtr;'''? – qwarten

+0

你需要使用'std :: shared_ptr'。我會在稍後修復答案。 –

+0

是的。指針也需要修復。 –

2

std::make_shared<Actor>()產生一個新的Actor,但你可能想要this。在任何情況下,您都不能創建擁有shared_ptr的任意已有對象,該對象已擁有所有者。嘗試改爲:

class Actor { 
public: 
    static Actor & make() 
    { 
     auto tmp = std::make_shared<Actor>(); 
     actorListPtr.push_back(tmp); 
     return * tmp; 
    } 

    static std::vector<shared_ptr<Actor>> & actorListPtr; 
} 

Actor & guy = Actor::make(); 
+0

您是否介意在第一條陳述中指出您的意思?我知道這就像用''new'''運算符創建一個actor,但爲什麼會出現這個問題呢? – qwarten

+0

@qwarten你叫'guy.add()',但是'add'忽略'guy'。 – Potatoswatter