所以,我想在C++中開發一個非常簡單的遊戲(我總是使用C#,我只是潛入C++),並且想要複製我的簡單(雖然設計不佳)我用C#製作的組件實體系統。循環依賴兩類 - 代碼不編譯
此代碼不能使用g ++與C++ 11標準進行編譯。
我該如何解決?我是否必須更改設計,或者是否有解決方法?
好格式化pastie:http://pastie.org/5078993
Eclipse的錯誤日誌
Description Resource Path Location Type
Invalid arguments '
Candidates are:
void push_back(Component * const &)
' Entity.cpp /TestEntity line 15 Semantic Error
Invalid arguments '
Candidates are:
__gnu_cxx::__normal_iterator<Component * *,std::vector<Component *,std::allocator<Component *>>> erase(__gnu_cxx::__normal_iterator<Component * *,std::vector<Component *,std::allocator<Component *>>>)
__gnu_cxx::__normal_iterator<Component * *,std::vector<Component *,std::allocator<Component *>>> erase(__gnu_cxx::__normal_iterator<Component * *,std::vector<Component *,std::allocator<Component *>>>, __gnu_cxx::__normal_iterator<Component * *,std::vector<Component *,std::allocator<Component *>>>)
' Entity.cpp /TestEntity line 19 Semantic Error
Method 'update' could not be resolved Entity.cpp /TestEntity line 22 Semantic Error
Invalid arguments '
Candidates are:
#0 remove(#0, #0, const #1 &)
' Entity.cpp /TestEntity line 19 Semantic Error
Component.h
#ifndef COMPONENT_H_
#define COMPONENT_H_
class Entity;
class Component {
private:
Entity* parentPtr;
public:
virtual void init();
virtual void update();
virtual ~Component();
void setParent(Entity* mParentPtr);
};
#endif /* COMPONENT_H_ */
Component.cpp
#include "Component.h"
void Component::setParent(Entity* mParentPtr) { parentPtr = mParentPtr; }
Entity.h
#ifndef ENTITY_H_
#define ENTITY_H_
#include "Component.h"
class Entity {
private:
std::vector<Component*> componentPtrs;
public:
~Entity();
void addComponent(Component* mComponentPtr);
void delComponent(Component* mComponentPtr);
void update();
};
#endif /* ENTITY_H_ */
Entity.cpp
#include <iostream>
#include <vector>
#include <list>
#include <string>
#include <sstream>
#include <algorithm>
#include "Entity.h"
#include "Component.h"
Entity::~Entity() {
for (auto &componentPtr : componentPtrs) delete componentPtr;
}
void Entity::addComponent(Component* mComponentPtr) {
componentPtrs.push_back(mComponentPtr);
mComponentPtr->setParent(this);
}
void Entity::delComponent(Component* mComponentPtr) {
componentPtrs.erase(remove(componentPtrs.begin(), componentPtrs.end(), mComponentPtr), componentPtrs.end());
delete mComponentPtr;
}
void Entity::update() { for (auto &componentPtr : componentPtrs) componentPtr->update(); }
您是否嘗試過'Entity.h'中的'Component'類的前向聲明,而不是包含頭文件,就像您使用'Component.h'中的'Entity'一樣? –
@JoachimPileborg剛剛嘗試過。同樣的問題 –
從錯誤信息中我們還不清楚哪些文件甚至被編譯,但我只是試着用g ++ 4.3.3和MSVC++ 9編譯Component.cpp和Entity.cpp(在註釋掉Entity ::〜 Entity()'和'Entity :: update()'它們使用'auto' C++ 11-ism),並且它們都能夠愉快地進行編譯而不會出錯。所以我確定錯誤不是來自這些文件。 –