Что здесь не так?- ISO C ++ запрещает объявление 'Circle' без типа - PullRequest
0 голосов
/ 28 июля 2010

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

In file included from ./Includes.h:19,
                 from ./Circle.h:8,
                 from ./Circle.cpp:5:
./GameApp.h:24: error: ISO C++ forbids declaration of 'Circle' with no type
./GameApp.h:24: error: expected ';' before '*' token

Вот GameApp.h:

#include "Includes.h"

class GameApp {

public:
 GameApp();
 ~GameApp();
 void Render();

protected:
 void InitGU();
 bool Controls();

 void *dList;  // display List, used by sceGUStart
 void *fbp0;  // frame buffer

 Circle* circle;
};

Внешний вид Include.hкак это:

//************************************************************************
//                              Includes.h
//************************************************************************

#include <malloc.h>     //For memalign()
#include <pspkernel.h>
#include <pspdisplay.h>
#include <pspdebug.h>
#include <stdio.h>
#include <psprtc.h>             // for the timer/fps functions
#include <pspctrl.h>
#include <math.h>

// GU
#include <pspgu.h>
#include <pspgum.h>

// Custom
#include "GameApp.h"
#include "Circle.h"


//************************************************************************

// Definitions
#define BUF_WIDTH (512)
#define SCR_WIDTH (480)
#define SCR_HEIGHT (272)

#define sin_d(x) (sin((x)*M_PI/180))
#define cos_d(x) (cos((x)*M_PI/180))
#define tan_d(x) (tan((x)*M_PI/180)) 

//************************************************************************

// structs, datatypes...
#ifndef VERTEX_TYPE_
#define VERTEX_TYPE_
typedef struct {
    unsigned int color;
    float x, y, z;
} vertex;
#endif

И Circle.h

//************************************************************************
//                              Circle.h
//************************************************************************

#ifndef CIRCLE_H_
#define CIRCLE_H_

#include "Includes.h"

class Circle {

public:
    Circle(float r1);
    ~Circle();
    void Render();

    float r;
    float x, y;
    float vx, vy;

protected:
    vertex* vertices;
    int n;

};

#endif

Ответы [ 6 ]

9 голосов
/ 28 июля 2010

Do not use one-массовый-include-to-include-everything (кроме предварительно скомпилированных заголовков).Это почти наверняка приведет к головной боли.

Включите то, что вам нужно , и не более.Это решит вашу проблему.

Вы можете отправить декларацию Circle, как ДанДан предложил , но исправление проблемы с включением поможет вам в долгосрочной перспективе.

2 голосов
/ 28 июля 2010

Вы можете иметь циклическое включение.Используйте предварительную декларацию:

class GameApp { 
class Cicle;
...
1 голос
/ 28 июля 2010

В файле Includes.h вам нужно переместить #include "Circle.h" на #include "GameApp.h"А еще лучше, просто включите Circle.h прямо из GameApp.h.Каждый заголовочный файл должен включать в себя все необходимое для непосредственной компиляции.

1 голос
/ 28 июля 2010

Includes.h включает GameApp.h перед включением Circle.h.Таким образом, Circle еще не определен в первый раз, когда он встречает определение GameApp.Как говорит ДанДан, нападающий объявляет Круг.

1 голос
/ 28 июля 2010

Я бы проверил ваш make-файл, чтобы убедиться, что сборка находится в правильном порядке, затем включите оба .h в каждую финальную попытку .h, объединяя класс, если есть оба простые.удачи

0 голосов
/ 28 июля 2010

@ Джеймс прав: Circle.h #include GameApp.h, как показано в исходном сообщении компилятора, а GameApp.h #include Circle.h через плохо продуманный «include-all» Include.h, но это #include бесполезно из-за избыточной защиты include в Circle.h

...