关于两个类的范围有误

时间:2011-12-21 01:12:47

标签: c++ class object scope

我有一个名为Engine的类。 TextureManager类的对象在Engine类内部,也是Window类的对象。

我的问题是TextureManager中的函数无法访问类Window中的公共函数或变量。

这是C ++的预期功能还是您认为我错误地声明/定义了这些对象中的一个或两个。

如您所见,在引擎内部有一个TextureManager和一个Window。

class Engine
{
  public:
        Engine();
        ~Engine();


        Window gameWindow;
        TextureManager textures;

        SDL_Event event;

        int test;
};

这是类Window

的标题
class Window
{
  public:
        //Constructors
        Window();
        ~Window();

        //Getter Functions
        SDL_Surface * get_screen();

        //Other Functions
        void toggle_fullscreen();
        void render();
        void initialize(int screenwidth, int screenheight);
        bool handle_events(SDL_Event event);
        bool check_error();

  private:
        bool windowed;
        bool windowFailure;

        int screenWidth;
        int screenHeight;

        SDL_Surface * screen;

};

这是TextureManager

类的头文件
class TextureManager
{
  public:
        TextureManager();
        ~TextureManager();

        int new_texture(std::string filename);
        int new_section(int indexOfTexture, int x, int y, int width, int height);

        void render_texture(int textureID, int x, int y);
        void render_section(int textureSectionID, int x, int y);
  private:
        std::vector< Texture > textureIDs;
        std::vector< TextureSection > textureSectionIDs;
};

这是我遇到麻烦的功能。在函数调用SDL_BlitSurface()

中访问gameWindow时出错
void TextureManager::render_texture(int textureID, int x, int y)
{
  SDL_Rect coordinates;
  coordinates.x = x;
  coordinates.y = y;
  SDL_BlitSurface(textureIDs[textureID].get_texture(), NULL, gameWindow.get_screen(), &coordinates);
} 

2 个答案:

答案 0 :(得分:2)

如前所述,TextureManager实例不知道类Window的gameWindow实例。您可以考虑以下方法来允许TextureManager与gameWindow进行交互:

class TextureManager {
public:
    TextureManager(Window& w) : m_refWindow(w) { /*...*/ }
    /*...*/
protected:
    Window& m_refWindow;
    /*...*/
}

void TextureManager::SomeMethod()
{
    m_refWindow.DoSomething();
}

Engine::Engine() :
    gameWindow(),
    textures(gameWindow)
{
 /*...*/
}

这样textures对象将绑定到gameWindow对象,并且可以调用其公共函数。

答案 1 :(得分:1)

TextureManager不知道它被用作Engine的成员变量,所以它不知道gameWindow是什么。

考虑一下你可以在任何地方实例化TextureManager的事实,包括根本没有gameWindow的上下文。成员函数只能“查看”局部变量,全局变量或其自己的成员变量。