【问题标题】:c2143, c4430 errors no clue whyc2143, c4430 错误不知道为什么
【发布时间】:2014-06-10 04:03:53
【问题描述】:

我将直接深入研究代码。我得到了

“错误 C2143:语法错误:缺少 ';'在'*'之前

错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 没有 支持默认整数

这是我定义头文件的方式,因为我认为头文件声明本身存在一些问题。我在声明播放器对象指针的行上的 Source.h 文件中出现错误 - CPlayer* myplayer

首先,

Headers.h

#pragma once

#include <iostream>
#include <string>
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_mixer.h>

GameSetup.h

#pragma once
#include "Headers.h"

class CGameSetup
{
public:
    CGameSetup(bool* _running,int ScreenWidth, int ScreenHeight);
    ~CGameSetup(void);

    SDL_Window* GetWindow();
    SDL_Renderer* GetRenderer();

    void Begin();
    void End();

private:
    SDL_Window* _screen;
    SDL_Renderer* _renderer;
};

Source.h

#pragma once
#include "Headers.h"
#include "GameSetup.h"
#include "Sprite.h"
#include <math.h>
#include "Player.h"

class CSource
{
public:
    CSource(int ScreenWidth,int ScreenHeight);
    ~CSource(void);
    void GameLoop();
    CSprite* getPlayerSpriteReference();
    SDL_Event getEventHandler();
    int getMouseX();
    int getMouseY();

private:
    bool _running;
    CPlayer* myplayer;  // THIS IS WHERE I AM GETTING THE TWO ERRORS ON**
    SDL_Event events;
    CGameSetup* gameSetup;
    CSprite* backgroundSprite;  
    int Mouse_X;
    int Mouse_Y;
    void Draw();
    void Update();
};

Player.h

#pragma once
#include "Source.h"

namespace playerStates {
    enum States {down=1,up,left,right,standing};
}

class CPlayer
{
public:
    CPlayer(CGameSetup* gameSetup, int* p_MouseX, int* p_MouseY);
    ~CPlayer(void);
    void playerMove();
    void drawPlayerSprite();
    CSprite* getPlayerSpriteReference();

private:
    CSprite* playerSprite;
    CGameSetup* gSetup;
    SDL_Event events;
    int* Mouse_X;
    int* Mouse_Y;
    int* newMousePos_X;
    int* newMousePos_Y;
    int currentTime;
    bool movePlayer;
    float GetDistance(float x1,float y1,float x2,float y2);
    void SetPlayerState(int type);
};

这些是我拥有的 4 个头文件。有人可以告诉我声明包含头文件是否有任何问题,或者这些错误是否与我难以排除的其他问题有关!

【问题讨论】:

  • 看起来像一个循环包含问题。 Source.h 和 Player.h 相互包含。
  • 是的,100% 循环依赖问题。
  • 但这不是我们使用 #pragma 一次以便摆脱循环问题的原因吗?
  • 如果我在源文件中注释掉所有播放器类的声明,那么错误就消失了。
  • 不,pragma once(顺便说一句,这是非标准的)只是一个 include 保护。它会阻止标头的多个副本包含在同一个源文件中。

标签: c++


【解决方案1】:

这里发生的事情是你的编译器正在进入Player.h,将其标记为“不要回到这里查看这个解析树”,然后遇到Source.h

Source.h 中包含Player.h 但是编译器已经将Player.h 标记为“不要回到这里”,所以它被跳过了。
CPlayer* myplayer; 行被命中时,编译器不知道CPlayer 是什么并抛出一个类型错误,因为它假定它是一个具有默认int 类型的名称。

解析树看起来像(简化的):

CPlayer.h
 -- Source.h
  -- Cplayer.h -- Skipped, #pragma once

解决循环依赖将为您解决问题。

【讨论】:

  • 哇!非常感谢 C++ 专业人士! :)
  • 所以我所做的是通过删除 source.h 并添加 gamesetup.h 和 sprite.h 来更改我的 player.h。这解决了这个问题。我还能怎么解决这个问题?
  • @JimZilla 你可以使用前向声明。由于Source.h 实际上不需要知道关于CPlayer 的任何信息,除了它存在并且它是class 之外,您可以在Source.h 中写:class CPlayer; 来宣布此信息。
  • 你做对了。重构代码直到没有循环依赖是摆脱它们的唯一方法。正如马特所说,前向声明也有很大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多