2016-01-02 3 views
1

Я думаю, что только следующие заголовки актуальны здесь:поле имеет неполную тип ошибки - опережающее объявление

Game.h

#include "Player.h" 
class Game 
{ 
private: 
    Player White; 
    Player Black; 
    Board current_board; 
}; 

Player.h:

#include "Game.h" 
#include "Piece.h" 
class Player 
{ 
private: 
    Chessend end; 
    std::string name; 
    std::vector <Piece> pieces; 
    Board* board_ptr; 
    Game* game_ptr; 

}; 

Piece.h:

#include "Player.h" 
    class Player; //forward declaration 
    class Piece 
    { 
    private: 
    Chesspiece type; 
    bool moved, taken; 
    Player *player; 

    }; 

дает е следующая ошибка

In file included from Player.h:11:0, 
       from Game.h:1, 
       from main.cpp:1: 
Game.h:20:10: error: field 'White' has incomplete type 'Player' 
    Player White; 
     ^
In file included from Player.h:9:0, 
       from Game.h:1, 
       from main.cpp:1: 
Piece.h:7:7: note: forward declaration of 'class Player' 
class Player; 

Я знаю, что есть опережающее объявление в Piece.h, но я не знаю, почему это является проблемой.

+0

Не указывайте game.h в player.h, потому что они нужны друг другу. В Player вам нужна игра *, поэтому вы можете написать 'class Game' перед классом Player. И включите game.h после 'class Player {};' –

+0

Когда у вас есть 2 класса, которые зависят от другого, когда вы не используете указатель, например 'Player White', вам необходимо, чтобы класс Player был определен заранее , –

+0

Большое спасибо. Не уверен, что я когда-нибудь пойму это! – user3457175

ответ

2

1) Добавить защитные меры против двойного включения во все ваши файлы заголовков. Самый простой способ (поддерживается большинство компиляторов):

#pragma once 

2) Для того, чтобы разорвать круговую зависимость, в Player.h DonT #include Game.h, но только сделать «предобъявление» класса игры, так как вам нужно только использовать его через указатели:

class Game; 

3) кроме того, в Piece.h DonT #include Player.h, но только вперед объявить класс игрока:

class Player; 

Как простое и общее правило, когда вы видите в файле заголовка ссылку на другой класс, но только с помощью указателя, не включайте заголовок этого другого класса, но только forward-declare. Мало того, что это правило нарушает круговые зависимости, но это даже минимизирует зависимости, что приводит к более быстрой компиляции и лучшей ремонтопригодности.

+1

Очень полезно - спасибо. – user3457175

Смежные вопросы