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

标签 c++ oop sdl

我是新手,出于教育目的仍在学习 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/

相关文章:

C#调用C++单例基于类的dll

c++ - 如何在数组 C++ 中存储未知数量的元素

math - 无法让我的对象指向鼠标

visual-studio-2012 - 如何配置 SDL 2.0 以与 Visual Studio 2012 一起使用?

video - 在 Windows 7 上使用 MinGW 构建具有视频支持的 PJSIP

c++ - 状态机实现

c++ - 在 Qt (C++) 中使用第三方库 (libconfig)

c - 隐藏的全局变量是不好的编程习惯吗?

c++ - 这是一个糟糕设计的例子吗?

java - 为什么 Stack 在 JDK 中扩展了 Vector?