С ++ ожидает ';' в конце объявления члена, когда есть один - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть две ошибки, которые возникают в одной строке кода. Ниже приведены фрагменты, там только соответствующий код.

Первый - это класс базы данных

#include "program.h"
using namespace std;
class Database {
public:
  Database(Program *program);
  ~Database();
};

Далее идет класс запросов.

#include "database.h"
using namespace std;

class Query {
public:
  Relation* evaluate(Database* database);
};

Строка, о которой идет речь:

Relation* evaluate(Database* database);
  1. Первая ошибка - "Database does not name a type", несмотря на включение файла database.h.
  2. Вторая ошибка "expected ';' after member declaration", которая, как мне кажется, связана с первой.

Все в этом проекте работало до добавления этого класса базы данных.

Я поставлен в тупик и изучал весь стекопоток, но безрезультатно. Я нахожусь на Debian Stretch и компилирую с g ++. У кого-нибудь есть идеи?

EDIT

Минимальный компилируемый код:

query.h

#include "database.h"

class Query {
public:
  void evaluate(Database* database);
};

program.h

#include "query.h"
#include "database.h"

using namespace std;
class Program {
public:

};

database.h

#include "program.h"

class Database {
public:
  Database(Program *program);
};

1 Ответ

0 голосов
/ 06 ноября 2018

Возможно, вы захотите попробовать опцию -E компилятора: он вызывает предварительную обработку исходного кода, то есть вы увидите код таким, каким его видит компилятор. Если вы внимательно посмотрите на свои заголовки, вы увидите, что существуют циклические зависимости между различными типами. Вам нужно их сломать.

Простое исправление - объявить класс Database в query.h:

class Database;

class Query {
public:
    void evaluate(Database* database);
};

Хотя это решит указанную проблему, циклические зависимости будут преследовать вас. В целом они плохие. Система классов, которые циклически зависят друг от друга, фактически являются одним компонентом и, вероятно, все они должны быть объявлены в одном заголовке.

...