gpt4 book ai didi

c++ - 将变量传递给多个类 - C++

转载 作者:太空宇宙 更新时间:2023-11-04 13:37:27 25 4
gpt4 key购买 nike

我是新手,出于教育目的仍在学习 OOP 和 SDL。

所以,我有一个变量 SDL_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();
}

这是 GameManager 类

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() 只是传递渲染器的 getter

这是我的主

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 被销毁时被销毁。

关于c++ - 将变量传递给多个类 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29096468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com