Перекрестная ссылка и круговая зависимость.Заголовок, включая себя косвенно - PullRequest
4 голосов
/ 23 декабря 2011

placeable.h

#include "selectable.h"

class placeable : selectable
{
..
};

selectable.h

#include "game.h"


class selectable
{
..
};

game.h

#include "placeable.h"

class game
{
...
class placeable* holding;
...
};

В основном placeable.h включает selectable.h, который включает game.h, который снова включает placeable.h.

Единственное решение, о котором я могу подумать, - это поместить помещаемый * в новый заголовок, сделать его статическим / глобальным, а затем включить этот новый заголовок в game.h и selectable.h.

Извините, я не включил охрану заголовков в верхний код. Я предположил, что это было очевидно. Охрана заголовка в этом случае не помогает из-за наследования, то же самое относится и к объявлению вперед.

Ответы [ 5 ]

5 голосов
/ 23 декабря 2011

Включать заголовки можно только в том случае, если вы ДОЛЖНЫ

Использовать предварительное декларирование вместо включения:

Вам нужно только включить заголовок для класса X, если:1008 *

  • У вас есть член класса 'X'
  • Вы производны от класса 'X'
  • Вы передаете параметр класса 'X' по значению.

В противном случае будет достаточно предварительного заявления.

//  -> Don't do this #include "placeable.h"
class     placeable;  // forward declare
                      // Fine if you are using a pointer.

class game
{
    ...
    class placeable* holding;
    ...
};

PS.Добавить заголовок охранников.

3 голосов
/ 23 декабря 2011

Это означает, что вы неправильно инкапсулировали функциональность своего дизайна.Это должен быть более высокий уровень, включающий более низкий уровень, а не один и тот же уровень, включающий один и тот же уровень.Если игра более высокого уровня, то выбор не должен включать game.h.

2 голосов
/ 23 декабря 2011

Это решенная проблема.Это называется охрана заголовков.Попробуйте это внутри ВСЕХ ваших файлов заголовков:

#ifndef __NAMEOFTHEFILE_H__
#define __NAMEOFTHEFILE_H__
// nothing goes above the ifndef above

// everything in the file goes here

// nothing comes after the endif below
#endif

Также вы можете сделать это (это называется прямой ссылкой):

// game.h

class placeable;

class game { ...
    placeable* p;
};
0 голосов
/ 30 марта 2015

Есть две проблемы:

  1. Зависимость круговых заголовков.Решение - #ifndef ...
  2. Выделение пространства для неизвестного типа.Решение - класс размещаемый;

Подробнее здесь

0 голосов
/ 23 декабря 2011

Используйте средства защиты заголовков в каждом из ваших файлов заголовков, чтобы избежать этой проблемы.В общем, ваши заголовочные файлы должны выглядеть так:

#ifndef PLACEABLE_H
#define PLACEABLE_H

//
// Class definitions and function declarations
//

#endif
...