2017-02-10 2 views
-2

Скажем, у меня есть класс, похожий на этот.C++ Pointer не ведет себя так, как ожидалось

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

Не возражаете ли вы немного разобраться в том, что вы подразумеваете под первым заявлением? Я понимаю, что это похоже на создание актера с оператором '' '' '' '' '' '', но почему это проблема? – qwarten

+0

@qwarten Вы вызываете 'guy.add()', но 'add' игнорирует' guy'. – Potatoswatter

Смежные вопросы