2015-02-18 2 views
-1

Я делаю игру на C++, и я хочу, чтобы мой класс Game удерживал все GameObjects. Он имеет вектор абстрактного базового класса геймобжекты, но для того, чтобы удерживать полученные типы, он должен быть вектором указателей на геймобжекты:Как содержать производные типы в векторе?

// Game.h 
class Game { 
private: 
    std::vector<GameObject*> gameObjects; 
public: 
    void addGameObject(GameObject* gameObject) { 
     gameObjects.push_back(gameObject); 
    } 
} 

Проблема, которая возникает случается, когда я хочу добавить GameObjects к вектор. Когда я передаю указатель на addGameObject, указатель становится NULL в другой области. Поэтому я хотел бы, чтобы указатель хранился в векторе, но не сразу стал NULL. Я не знаю, как мне обойти эту проблему. Есть идеи?

Редактировать: Спасибо всем, что комментировали. Я использовал C++ некоторое время, но я новичок в использовании указателей и пока не понимаю их полностью. Я знал, что вам нужно использовать их для создания вектора, в котором хранятся производные объекты. Наверное, мне нужно исследовать указатели намного больше.

+0

Почему указатель становится NULL в другом пространстве? Покажите этот код, пожалуйста. –

+5

Проблема в другом месте. Поведение, которое вы описали, не имеет никакого отношения к 'vector :: push_back'. – Pradhan

+1

Это не имеет смысла. Указатели передаются по значению, и нет никакой функции 'addGameObject', чтобы сделать исходный указатель' NULL'. Во всяком случае, современный C++ должен, вероятно, использовать интеллектуальные указатели. – 5gon12eder

ответ

1

«Проблема, которая возникает происходит, когда я хочу добавить GameObjects вектора. Когда я передать указатель на addGameObject, указатель становится в другом объеме NULL.»

Я не могу сказать, почему эти указатели становятся NULL в другом объеме, как вы не упомянули достаточно контекста proove это.

Но я думаю, что лучший выбор, кажется, используя smart pointer как этот

// Game.h 
class Game { 
private: 
    std::vector<std::shared_ptr<GameObject>> gameObjects; 
public: 
    void addGameObject(std::shared_ptr<GameObject> gameObject) { 
     gameObjects.push_back(gameObject); 
    } 
} 

Есть несколько вариантов для смарт-указатели, в зависимости от ваших конкретных случаев применения для них, а именно std::unique_ptr<GameObject> или std::weak_ptr<GameObject>.

std::shared_ptr<GameObject> (или другие упомянутые варианты умных указателей) должны хорошо служить для экземпляров, полученных из класса GameObject, например, например.

class Player : public GameObject { 
    // ... 
}; 

Это управлять ссылками на ваш GameObject, например, как они используются, или, находящихся в собственности в любой области.

+0

Почему нет 'std :: move'? Кроме того, 'std :: unique_ptr' может быть, вероятно, более уместным, хотя мы не можем сказать. – Deduplicator

+0

@Deduplicator _ «хотя мы не можем сказать». Да. По крайней мере, я упомянул другие (основные) доступные варианты умных указателей. То, что фактически требуется OP, полностью зависит от семантики (не уточняется). –

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