是什么在构造函数之后导致这些“意外令牌”错误?

时间:2019-06-19 14:43:53

标签: c++ inheritance

我正在电路仿真器/寻路系统上工作,但我不断遇到这些奇怪的编译错误。我还没有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个错误,但我认为它们是这些错误的结果,可以肯定的是,这些是:

(大声笑,由于没有足够的声誉而无法嵌入图像,因此可以使用链接...)

Click here for errors

我尝试过的事情

我尝试了以下操作:

  • 使用引用而不是指针。 (将Circuit* c更改为Circuit& c
  • 在构造函数初始化器列表中删除名称字符串隐藏内容。 (将... : Object(name + "blah")更改为... : Object(name)
  • 将整个Visual Studio项目重写为一个新的Visual Studio项目。
  • 将构造函数初始化器列表放在头文件中。
  • 很多谷歌搜索...并没有很多解决方法...

如何解决?

这个令人沮丧的问题使我无法继续从事该项目,是什么原因引起的,以及如何解决?我很高兴知道。

Object.hpp

#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;
};

Object.cpp

#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);
}

Component.hpp

#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
};

Component.cpp

#include "Component.hpp"

Component::Component(string name, Circuit* container) : Object(name), container(container)
{ }

Switch.hpp

#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.cpp

Switch::Switch(string name, Circuit* container, Wire& wire1, Wire& wire2) : Component(name + "-Switch", container), wire1(&wire1), wire2(&wire2), enabled(false)
{ }

...

Circuit.hpp

#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;
};

Circuit.cpp

#include "Circuit.hpp"
#include "Util.hpp"

Circuit::Circuit(string name) : Object(name + "-Circuit")
{
    active = false;
    powerWire = new Wire(name + "-PowerWire", this);
}

...

1 个答案:

答案 0 :(得分:5)

您还没有显示Wire.hpp,但是我猜测它包含Component.hpp,这为您提供了包含标题的循环(因为Component.hpp包含Circuit.hpp,并且Circuit.hpp包括Wire.hpp)。

您必须用正向声明替换其中一些内容,以打破循环。