两个类中的循环依赖 - 代码无法编译

时间:2012-10-18 14:24:06

标签: c++ g++ dependencies header-files circular-dependency

所以,我正在尝试用C ++开发一个非常简单的游戏(我总是使用C#,我只是潜入C ++),并希望复制我使用的简单(虽然设计不佳)组件实体系统C#。

此代码不能使用带有C ++ 11标准的g ++进行编译。

我该如何解决?我是否需要更改设计,还是有解决方法?


格式良好的牧师: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(); }

3 个答案:

答案 0 :(得分:1)

事实证明,实际上没有循环依赖问题,代码编译和链接很好。 “错误”实际上只是Eclipse过于频繁的代码分析报告 - 在命令行上单独编译每个.cpp文件

g++ -c thatfile.cpp

不会产生编译错误,并且一次编译和链接

g++ Entity.cpp Component.cpp

生成可运作的可执行文件。

答案 1 :(得分:0)

您必须将Entity.h加入component.cpp

答案 2 :(得分:0)

是否可能,问题不是循环包含,而是代码本身?例如:“无法解析方法'更新'”提示您必须定义Component::update方法,与Component::init方法相同,因为它们不是纯虚拟方法。请先尝试删除此错误,然后查看是否有帮助

<强>更新 所以...我测试了你的代码。不是使用eclipse而是使用Visual Studio 2008.我将for (auto...内容替换为“普通”for (std::vector<Component*>::iterator...,因为在此版本的VS中不可用。我可以说,没有循环依赖,但你忘记了Entity.h文件中的#include <vector>。那些虚拟功能的定义遗失了,但是你说,你已经添加了它们,所以不要理会;)