Я получаю сообщение об ошибке «ожидаемое имя класса перед токеном '{'» в моем проекте C ++ Qt. После поиска в Google кажется, что проблема с круговыми включениями. У меня есть pawn.h, который включает piece.h, в том числе board.h, который завершает круг включением pawn.h. Я читал, что это можно исправить с помощью предварительных объявлений, но я пробовал заранее объявить несколько проблемных классов, и это не сработало.

#ifndef PAWN_H
#define PAWN_H

#include "piece.h"

class Pawn : public Piece
{
    Q_OBJECT
public:
    explicit Pawn(QWidget *parent = 0);
};

#endif // PAWN_H

.

#ifndef PIECE_H
#define PIECE_H

#include <QWidget>
#include "board.h"

class Board;
class Piece : public QWidget
{
    Q_OBJECT
public:
    explicit Piece(QWidget *parent = 0);
    void setPosition(int rank, int file);
    QPixmap pixmap;

protected:
    void paintEvent(QPaintEvent *);

private:
    int rank;
    int file;
    int x;
    int y;
};

#endif // PIECE_H

.

#ifndef BOARD_H
#define BOARD_H

#include <QWidget>
#include <QVector>
#include <QGridLayout>
#include "square.h"
#include "pawn.h"
#include "knight.h"
#include "bishop.h"
#include "queen.h"
#include "king.h"

class Board : public QWidget
{
public:
    explicit Board(QWidget *parent = 0);
    QVector < QVector<Square *> > sqrVector;
    Pawn *pawn[8];

    Knight *knight[2];

    Bishop *bishop[2];

    Queen *queen;
    King *king;

private:
    QGridLayout *layout;
};

#endif // BOARD_H
4
gsingh2011 26 Авг 2011 в 07:44

2 ответа

Лучший ответ

Вместо того, чтобы пробовать что-то наугад, попробуйте изменить board.h, чтобы включить форвардные объявления для всех частей:

Board.h

class Pawn;
class Knight;
class Bishop;
class Queen;
class King;

И удали соответствующие операторы #include. (Вам, вероятно, придется поместить эти операторы #include в board.cpp, когда вы решите, что вам нужно заглянуть внутрь различных классов частей.)

4
Greg Hewgill 26 Авг 2011 в 03:48

Ваша основная проблема заключается в файле: piece.h. Поскольку board не упоминается явно в файле, include для него и предварительное объявление должны быть удалены. Это разорвет круг. Кроме того, как отметил Грег, в board.h.

1
Community 23 Май 2017 в 11:48