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

passing variable to multiple classes - C++

本文关键字:C++ 变量      更新时间:2023-10-16

我是新手,仍在学习 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被销毁时才会被销毁。