Проблема с определениями классов в C

#c #class

#c #класс

Вопрос:

У меня есть класс, определенный в файле board.H :

 class Board
{
private:
    ...

public:
    ...
};
  

и в другом классе я хочу иметь член, который является указателем на Board объект:

 #include "board.H"

class Bear
{
private:
    Board* board;
    ...
public:
    ...
};
  

Когда я пытаюсь его скомпилировать (используя g в Linux) Я получаю следующую ошибку:

 bear.H:15: error: ISO C   forbids declaration of `Board' with no type
bear.H:15: error: expected `;' before '*' token
  

Что я делаю не так?

Комментарии:

1. Находится ли определение класса вашей платы внутри пространства имен?

2. Я подозреваю, что ошибка кроется в той части кода, которую вы обрезали.

3. Как вы это компилируете? Я не вижу проблем с вашим кодом.

Ответ №1:

Распространенная проблема. У вас, вероятно, есть #include "bear.H" строка в вашей «доске.Файл H» или в файле, включенном в «board.H».

Поэтому, когда вы включаете «медведь.H» в»доску.H», «медведь.H» Файл обработан и пытается включить «доску.H», но этот файл уже обрабатывается, поэтому заголовок «bear.H» не будет включать содержимое в другой раз. Но потом «медведь.H» обрабатывается без определения ведущего класса «Board».

Комментарии:

1. @Iiya Melamed Я рекомендую вам задать новый вопрос по этому поводу. Но в качестве подсказки — постарайтесь не зависеть от определения класса Bear в «board.H». Например, «Bear *» не нуждается в определении класса «Bear», а только в прямом объявлении типа «class Bear;». Тогда вам не нужно включать «bear. Заголовок H». То же самое касается «void f(Bear b);» (но не «void f(Bear b) { }») и «Bearamp;».

2. Директивы компилятора. Оборачивая ваши классы директивами #ifndef, #define, #endif, которые находятся по следующему адресу, компилятор должен попытаться скомпилировать каждый класс только один раз: cprogramming.com/reference/preprocessor/ifndef.html

3. Мне нравится, насколько неоднозначны сообщения об ошибках циклической зависимости, подобные этому.

Ответ №2:

Проверьте пространство имен. Если Board находится в пространстве имен, отличном от Bear , вам нужно добавить в Bear.h:

 using <namespace>:: Board;