2017-02-10 9 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(); 

actorListに等しいactorListPtrの内容を確認する必要があります。しかし、私にとってはそうではありません。私は何が欠けていますか?

+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

最初の声明で何を意味するのか少し詳しくお考えですか?私は ''新 ''演算子を使って俳優を作るようなものだが、それはなぜ問題なのだろうか? – qwarten

+0

@qwartenあなたは 'guy.add()'を呼びますが、 'add'は' guy'を無視します。 – Potatoswatter

関連する問題