我正在重写lazyfoo.net上的鼠标输入教程,以使用header和cpp文件,而不是将所有内容放在一个cpp文件中。我这样做只是为了练习。我正在运行Windows 10,我在戴尔笔记本电脑上使用Code :: Blocks 16.01。
当我编译以下源代码时,我收到一条错误消息,其中显示" {' {'令牌"在我的ltexture.h文件中。我已经尝试在我的ltexture.h文件中声明CentralClass,当我这样做时,我收到一条错误消息,说明"无效使用不完整类型'类CentralClass'"。我也在这个网站上查了几个相同问题的答案,但似乎没什么用。
这是代码。
ltexture.h
#ifndef LTEXTURE_H_INCLUDED
#define LTEXTURE_H_INCLUDED
#include <string>
#include "central_class.h"
class LTexture : public CentralClass
{
// The actual hardware texture
SDL_Texture *mTexture;
// Image dimensions
int mWidth;
int mHeight;
public:
// Initialize variables
LTexture();
// Deallocates memory
~LTexture();
// Loads image at specified path
bool loadFromFile(std::string path);
// Deallocates texture
void free();
// Renders texture at given point
void render(int x, int y, SDL_Rect *clip = nullptr, double angle = 0, SDL_Point *center = nullptr, SDL_RendererFlip flip = SDL_FLIP_NONE);
// Gets image dimensions
int getWidth() {return mWidth;}
int getHeight() {return mHeight;}
};
#endif // LTEXTURE_H_INCLUDED
central_class.h
#ifndef CENTRAL_CLASS_H_INCLUDED
#define CENTRAL_CLASS_H_INCLUDED
#include <SDL.h>
#include "lButtonSprite.h"
#include "lbutton.h"
#include "ltexture.h"
#include "global.h"
class CentralClass
{
// The window we'll be rendering to
SDL_Window *mWindow;
// Button objects
LButton mButtons[global::TOTAL_BUTTONS];
protected:
// The window renderer
SDL_Renderer *mRenderer;
// Mouse button sprites
SDL_Rect mSpriteClips[button::TOTAL];
LTexture mButtonSpriteSheetTexture;
public:
// Call all functions
CentralClass();
// Starts up SDL and creates window
bool init();
// Loads media
bool loadMedia();
// Main part of the program
void mainLoop();
// Frees media and shuts down SDL
void close();
// Clean up
~CentralClass();
};
#endif // CENTRAL_CLASS_H_INCLUDED
这两个类都依赖于彼此。请帮助摆脱这些错误。我不知道该怎么做。输入代码
答案 0 :(得分:0)
两个文件都包含另一个文件,这会导致无限循环(这是#define禁止的。)
无论哪种方式,其中一个错过了另一个的类定义。解决这个问题的唯一方法是转发声明。
要解决此问题,请在其中一个(或两个)文件中输入class xxx;
,分别引用另一个类。
此外,结构中存在逻辑错误,因为类1包含类2的对象,类2从类1派生(因此它包含类1的对象)。显然,一个类不能包含自身的对象;这将是无限的递归定义。我假设另一个内部的类应该是对象的指针,而不是对象。