将变量传递给多个类 - C++
passing variable to multiple classes - C++
我是新手,仍在学习 OOP 和 SDL 以用于教育目的。
所以,我有一个变量SDL_Renderer renderer
这个变量只需要启动一次,我GameManager
类中启动它。我还有另一个名为 Texture
的类需要该renderer
.此Texture
将经常使用。
那么我如何通过这个renderer
? 我必须在Texture
班中打电话给GameManager
吗? 但是如果我这样做,那就意味着我每次使用Texture
时都会GameManager
对吗? 还是有别的办法?
谢谢你帮助我,如果我的问题含糊不清或不清楚,我真的很抱歉。
编辑
这是纹理类
class Texture
{
public:
Texture();
~Texture();
int getWidth();
int getHeight();
bool loadFromFile(std::string path);
bool loadTextFromFile(std::string text, SDL_Color textColor, TTF_Font* font);
void render(int x, int y, SDL_Rect* clip = NULL);
void free();
bool lockTexture();
bool unlockTexture();
void* getPixels();
int getPitch();
private:
int vWidth;
int vHeight;
SDL_Texture* vTexture;
SDL_Renderer* renderer;
void* pPixels;
int pPitch;
};
这是启动器
Texture::Texture()
{
vTexture = NULL;
vWidth = 0;
vHeight = 0;
renderer = GameManager::getRenderer();
}
这是游戏管理器类
class GameManager
{
public:
GameManager();
~GameManager();
bool intializeGame();
void gameLoop();
static SDL_Renderer* getRenderer();
private:
SDL_Window* window = NULL;
static SDL_Renderer* renderer;
TTF_Font* font = NULL;
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
};
getRenderer()
只是一个通过渲染器的获取器
这是我的主要
int main(int argc, char* args[])
{
GameManager gameManager;
gameManager.intializeGame();
Texture charTexture;
SDL_Rect rect;
bool text = charTexture.loadFromFile("foo.png");
if (!text)
{
printf("texture not loaded");
}
rect.x = 0;
rect.y = 0;
rect.w = charTexture.getWidth();
rect.h = charTexture.getHeight();
while (true)
{
SDL_SetRenderDrawColor(GameManager::getRenderer(), 0xFF, 0xFF, 0xFF, 0xFF);
SDL_RenderClear(GameManager::getRenderer());
charTexture.render(10, 10, &rect);
SDL_RenderPresent(GameManager::getRenderer());
}
return 0;
}
我希望它不会令人困惑。
免责声明:我从未使用过 SDL。这可能很糟糕,但它是基于你给我的东西。重要的是所有权。这是一个共享所有权示例。这很简单,可以减轻弄清楚何时摧毁SDL_Renderer的负担。
class GameManager {
//BLABGLABLA
public:
std::shared_ptr<SDL_Renderer> getRenderer();
private:
std::shared_ptr<SDL_Renderer> renderer
}
class Texture
{
public:
Texture(std::shared_ptr<SDL_Renderer> theRenderer, //some other args)
private:
std::shared_ptr<SDL_Renderer> renderer;
}
因此,仅根据类的名称,您可能希望 GameManager 拥有渲染器,但您也希望 Texture 能够访问它。一种方法是在两个类中都有一个 shared_ptr
成员,并将呈现器传递给其构造函数中的纹理。
基本上,您在 GameManager 中初始化的渲染器对象只有在指向它的最后一个shared_ptr
被销毁时才会被销毁。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 当vector是tje全局变量时,c++中vector的内存管理
- 通过多个头文件使用常量变量
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 执行函数时导致崩溃的变量
- 变量没有改变?通过向量的函数调用