Регистрация в конструкторе (по наследованию), после того, как конструктор копирования больше не доступен

#c #constructor #copy-constructor

#c #конструктор #конструктор копирования

Вопрос:

Я должен программировать игру на C и OpenGL. Я попытался структурировать его после Unity, поэтому у меня есть Gameobject s, которые наследуют Component нужные им s. Моя проблема в моем средстве визуализации. Этот компонент содержит форму, Vao, Vbo и цвет. В этом конструкторе я пытаюсь зарегистрировать объект в моем GameView

 LineRenderer::LineRenderer(){
    shape = { 1.0,1.0,0.0,
        1.0,0.0,0.0,
        0.0,0.0,0.0,
        0.0,1.0,0.0 };
    InitializeVertexArrayObject(amp;VAO, amp;VBO, shape);
    GameView::add(this);
}
 

В GameView качестве члена имеет статический вектор:

 static std::vector<LineRenderer*> items;
 

И add функция просто добавляет указатель на вектор:

 void GameView::add(LineRenderer* item){
    items.push_back(item);
}
 

Теперь, очевидно, это не работает, потому что каждый раз, когда я хочу отобразить объекты в GameView , они больше не существуют. Google говорит, что это как-то связано с конструктором копирования, и кажется, что я хочу это сделать, это невозможно.

Вопрос в том, возможно ли вообще наследовать от класса, который регистрирует себя где-то в другом месте (если объект всегда копируется в переменную, которой он назначен)? И, если нет, каков наилучший способ реализовать поведение, подобное этому?

Ответ №1:

Если вы не копируете сам объект, копирование указателей не повлияет на конструктор после его создания. Вектор просто скопирует / переместит его. Допустим, что вы создаете LineRenderer подобное ниже,

 void SomeFunction()
{
    ...
    LineRenderer* pRenderer = new LineRenderer();    // The constructor will be called here.
    ...
    delete pRenderer;    // The destructor will be called here.
}
 

Теперь, очевидно, это не работает, потому что каждый раз, когда я хочу отобразить объекты в GameView, они больше не существуют.

Да, если вы выделяете их в стеке. Используйте выделение кучи, как я уже говорил, и все получится.

Примечание: Если вы что-то выделяете в куче, обязательно удалите это!

возможно ли вообще наследовать от класса, который регистрирует себя где-то в другом месте (если объект всегда копируется в переменную, которой он назначен)?

В вашем случае, да, вы можете. И вы работаете с указателями здесь, поэтому вы не копируете сам объект, а просто копируете его адрес.

А если нет, то каков наилучший способ реализовать поведение, подобное этому?

Как вы уже говорили ранее, если вы хотите, чтобы ваша игра работала как Unity, ваш подход несколько отличается. Unity использует систему компонентов сущностей, в то время как вы используете то же самое, что Unity пытается обойти. Но, глядя на вашу реализацию, вам нужно избегать статического выделения этих объектов, а не размещать их в куче. Помните, тогда вам придется управлять временем его жизни!