我正在电路仿真器/寻路系统上工作,但我不断遇到这些奇怪的编译错误。我还没有OO C ++的经验来自己弄清楚……
我项目中的对象是通过以下方式实现的:
我的 Object 类是项目中所有内容的基类,这对于通过给所有内容命名和提供ID来进行调试非常有用。 我要求每个组件都需要一个电路(将其作为组件的父级)。我是通过在Component类中创建一个需要引用Circuit对象的引用的构造函数来实现的。
起初,一切工作正常且编译良好,但是当我引入Circuit类并在Component中添加带有Circuit参考参数的构造函数时,一切都出错了。
编译错误
现在,我不断收到这些看似随机的语法和缺少令牌的错误。 (Intellisense不会标记它们吗?)
弹出的前四个错误是:
C2238: unexpected token(s) preceding ';'
。
在Component.hpp的第10行。在文件Circuit.hpp的第12行。 两者都在构造函数定义之后。 (请参见下面的代码)
接下来的四个错误指向相同的位置,但是它指出:
C2143: syntax error: missing ';' before '*'
。
然后,再出现30个错误,但我认为它们是这些错误的结果,可以肯定的是,这些是:
(大声笑,由于没有足够的声誉而无法嵌入图像,因此可以使用链接...)
我尝试过的事情
我尝试了以下操作:
Circuit* c
更改为Circuit& c
)... : Object(name + "blah")
更改为... : Object(name)
)如何解决?
这个令人沮丧的问题使我无法继续从事该项目,是什么原因引起的,以及如何解决?我很高兴知道。
#pragma once
#include <string>
using std::string;
class Object
{
public:
Object();
Object(string name);
string name;
const int id;
virtual string toString();
private:
static int currentId;
};
#include "Object.hpp"
int Object::currentId = 0;
Object::Object() : id(++Object::currentId), name("Object")
{ }
Object::Object(string name) : id(++Object::currentId), name(name)
{ }
string Object::toString()
{
return name + "#" + std::to_string(id);
}
#pragma once
#include "Object.hpp"
#include "Circuit.hpp"
class Component : public Object
{
public:
Component(std::string name, Circuit* container);
Circuit *container; // <- Error points to the beginning of this line
};
#include "Component.hpp"
Component::Component(string name, Circuit* container) : Object(name), container(container)
{ }
#pragma once
#include "Component.hpp"
#include "Wire.hpp"
class Switch : public Component
{
public:
Switch(string name, Circuit* container, Wire& wire1, Wire& wire2);
Wire* wire1;
Wire* wire2;
void setEnabled(bool enabled);
bool getEnabled();
private:
bool enabled;
};
Switch::Switch(string name, Circuit* container, Wire& wire1, Wire& wire2) : Component(name + "-Switch", container), wire1(&wire1), wire2(&wire2), enabled(false)
{ }
...
#pragma once
#include "Object.hpp"
#include "Wire.hpp"
class Circuit : public Object
{
public:
Circuit(std::string name);
Wire* powerWire; // <- Error points to the beginning of this line
bool isPowered(Wire& wire);
bool getActive();
void setActive(bool active);
private:
bool active;
};
#include "Circuit.hpp"
#include "Util.hpp"
Circuit::Circuit(string name) : Object(name + "-Circuit")
{
active = false;
powerWire = new Wire(name + "-PowerWire", this);
}
...
答案 0 :(得分:5)
您还没有显示Wire.hpp
,但是我猜测它包含Component.hpp
,这为您提供了包含标题的循环(因为Component.hpp
包含Circuit.hpp
,并且Circuit.hpp
包括Wire.hpp
)。
您必须用正向声明替换其中一些内容,以打破循环。