2016-05-03 4 views
-2

У меня есть заголовок ...Global станд :: вектор не сохраняя данные

Components.h

namespace ComponentManager 
{ 
    void InitializeComponents(std::size_t numComponents); 
    void AddComponent(const Component& c, std::size_t position); 
    std::vector<Component> GetComponents(); 
} 

... и реализации:

Components.cpp

#include "Components.h" 

std::vector<ComponentManager::Component> components; 

void ComponentManager::InitializeComponents(std::size_t numComponents) 
{ 
    components.resize(numComponents, Component()); 
} 

void ComponentManager::AddComponent(const Component& c, std::size_t pos) 
{ 
    components[pos] = c; 
} 

std::vector<ComponentManager::Component> ComponentManager::GetComponents() 
{ 
    return components; 
} 

В main.cpp, я удостоверяюсь, чтобы инициализировать вектор компонентов, и я добавляю несколько компонентов. После отладки каждого вызова AddComponent (...) я вижу, что компоненты фактически хранятся в векторе. Однако, когда я вызываю GetComponents(), возвращаемый вектор отличается, как будто компоненты никогда не сохранялись.

Что мне не хватает?

EDIT: Добавление main.cpp (внутри основная() функция)

//Inside EntityManager::Initialize(), I call ComponentManager::InitializeComponents() 
EntityManager::Initialize(5000); 
for (unsigned int i = 0; i < 10; ++i) 
{ 
    uint16_t handle = EntityManager::CreatePlayer(static_cast<float>(i), 50.0f * i); 
    //Inside EntityManager::AddComponent, I call ComponentManager::AddComponent(..) 
    EntityManager::AddComponent(handle, ComponentManager::POSITION_COMPONENT | ComponentManager::RENDERABLE_COMPONENT); 
} 
auto components = ComponentManager::GetComponents(); //this vector does not contain the elements that were added. 
+1

Вы говорите «в main.cpp», но на самом деле вы имеете в виду функцию «main» или конструктор глобального объекта в "main.cpp"? Потому что, если это последний, это порядок инициализации, и у нас недавно был точно такой же вопрос. –

+0

Что такое 'Компонент'? –

+0

Почему вы не публикуете содержимое 'main.cpp'? Они очень важны для ответа на ваш вопрос. – Quentin

ответ

1

Первоначально это было определение компонента:

union Component 
{ 
    PositionComponent positionComponent; 
    VelocityComponent velocityComponent; 
    AccelerationComponent accelerationComponent; 
    RenderableComponent renderableComponent; 
    Component() {} 
    ~Component() {} 
    Component(const Component& other) {} 
    Component& operator=(const Component& other) 
    { 
     std::memmove(this, &other, sizeof(other)); 
     return *this; 
    } 
}; 

Добавление определения для конструкторы и для копии конструктором было исправление:

union Component 
{ 
    PositionComponent positionComponent; 
    VelocityComponent velocityComponent; 
    AccelerationComponent accelerationComponent; 
    RenderableComponent renderableComponent; 
    Component() 
    { 
     std::memset(this, 0, sizeof(Component)); 
    } 
    ~Component() {} 
    Component(const Component& other) 
    { 
     std::memmove(this, &other, sizeof(other)); 
    } 
    Component& operator=(const Component& other) 
    { 
     std::memmove(this, &other, sizeof(other)); 
     return *this; 
    } 
}; 
Смежные вопросы