标识符包含标题后使用未定义的类

时间:2015-11-25 22:51:24

标签: c++

我有一个包含多个类的程序,并且我们将它们全部链接在一个主标题中:

#ifndef __MAIN_H_INCLUDED__
#define __MAIN_H_INCLUDED__

//Using SDL, SDL_image, standard IO, strings, and file streams

#include <SDL.h>
#include <SDL_image.h>
#include <stdio.h>
#include <string>
#include <fstream>
#include "ltexture.h"
#include "tile.h"
#include "player.h"
#include "enemy.h"
#include "egg.h"

然后我在每个头文件中都有一个指向main.h的链接。除非我尝试声明

,否则所有内容都会链接在一起
class LTexture;
LTexture gTileTexture;
LTexture gPlayerSpriteSheetTexture;
LTexture gEnemySpriteSheetTexture;
LTexture gEggSpriteSheetTexture;

我知道他们每个人都使用未定义的类“LTexture”。我知道我使用前向声明并同时包含但这种方式给了我最少的错误,只是使用包含或前向声明给出了更多的错误。我在标题中声明这些的原因是因为它们被用在其他每个类中。

纹理类我刚从lazyfoo的教程中使用

#ifndef __LTEXTURE_H_INCLUDED__
#define __LTEXTURE_H_INCLUDED__

#include "main.h"

class LTexture
{
public:
    //Initializes variables
    LTexture();

    //Deallocates memory
    ~LTexture();

    //Loads image at specified path
    bool loadFromFile(std::string path);

    //Creates image from font string
    bool loadFromRenderedText(std::string textureText, SDL_Color textColor);

    //Deallocates texture
    void free();

    //Set color modulation
    void setColor(Uint8 red, Uint8 green, Uint8 blue);

    //Set blending
    void setBlendMode(SDL_BlendMode blending);

    //Set alpha modulation
    void setAlpha(Uint8 alpha);

    //Renders texture at given point
    void render(int x, int y, SDL_Rect* clip = NULL, double angle = 0.0, SDL_Point* center = NULL, SDL_RendererFlip flip = SDL_FLIP_NONE);

//Gets image dimensions
int getWidth();
int getHeight();

private:
    //The actual hardware texture
    SDL_Texture* mTexture;

    //Image dimensions
    int mWidth;
    int mHeight;
};

#endif

如果将LTexture链接到工作纹理类

,为什么LTexture未定义

我尝试将所有外部定义放在一个cpp中,我发现它只是从一个cpp中删除了错误。因此,我将所有定义分解为需要它们的特定类,但是它们仍然需要多个,并且两次声明它们也会导致错误。那么我如何链接标题是一个问题?我设置标题的方式是每个cpp引用它的标题然后标题引用main.h.使用main.h引用其他每个标题

1 个答案:

答案 0 :(得分:0)

您无法使用未定义(前向声明)类型定义变量,因为编译器不知道它们应该有多大或者如何调用它们的构造函数/析构函数。

此外,你所做的工作,每个.cpp都有自己的变量副本。你想要的是extern LTexture gTileTexture;并将定义放在一个.cpp。