2017-02-10 102 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