我有一个名为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);
}
答案 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
的上下文。成员函数只能“查看”局部变量,全局变量或其自己的成员变量。