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

时间:2015-03-17 10:15:58

标签: c++ oop sdl

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

所以,我有一个变量SDL_Renderer renderer。这个变量只需要启动一次,我在GameManager类中启动它。 我有另一个名为Texture的类需要renderer。 这个Texture会经常使用。

那我如何通过这个renderer?我是否必须在GameManager课程中致电Texture?但如果我这样做,这意味着我每次使用GameManager权利时都会Texture?还是有另一种方式?

谢谢你的帮助,如果我的问题模糊或不清楚,我真的很抱歉。

修改

这是Texture class

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()只是一个传递渲染器的吸气剂

这是我的主要

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;
}

我希望它不会混淆。

1 个答案:

答案 0 :(得分: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被销毁时销毁。