Что вызывает эти «неожиданные токены» ошибки после конструктора? - PullRequest
1 голос
/ 19 июня 2019

Я работаю над симулятором цепи / системой поиска пути, но продолжаю получать эти странные ошибки компиляции.У меня пока нет опыта работы с OO C ++, чтобы самому разобраться ...

Дерево объектов

Объекты в моем проекте реализованы следующим образом:

  • Объект
    • Компонент
      • Провод
      • Переключатель
    • Цепь

My Object class является базовым классом для всего в моем проекте, он отлично подходит для отладки, давая всем имя и идентификатор.Мне потребовалось, чтобы каждому компоненту была нужна схема с (смотрите его как родительский для компонентов).Я реализовал это, создав конструктор в классе Component, который требует ссылки на объект Circuit.

Сначала все работало и компилировалось нормально, но когда я представил класс Circuit и добавил конструктор в Componentсо ссылочным параметром Circuit все пошло не так ...

Ошибки компиляции

Теперь я продолжаю получать этот, казалось бы, случайный синтаксис и ошибки отсутствующих токенов.(Intellisense не помечает их?)

Первые четыре всплывающие ошибки:

C2238: unexpected token(s) preceding ';'.

В строке 10 Component.hpp.И в строке 12 в файле Circuit.hpp.Оба сразу после определения конструктора.(См. В коде ниже)

Следующие четыре ошибки указывают на те же места, но он отмечает:

C2143: syntax error: missing ';' before '*'.

Затем следуют еще 30 ошибок, ноЯ думаю, что они являются результатом этих ошибок, безусловно, вот они:

(Lol, не могу встроить изображение, вызванное нехваткой репутации, поэтому вместо ссылки ...)

Нажмите здесь для ошибок

Что я пробовал

Я попробовал следующее:

  • Используя ссылкувместо указателя.(изменено 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 Ответ

5 голосов
/ 19 июня 2019

Вы не показали Wire.hpp, но я предполагаю, что он включает Component.hpp, что дает вам цикл включения заголовка (потому что Component.hpp включает Circuit.hpp, а Circuit.hpp включает Wire.hpp) .

Вам придется заменить некоторые из этих включений на предварительные объявления, чтобы разорвать цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...