通过引用/地址传递SDL窗口

时间:2019-01-28 23:16:36

标签: c++ c++11 sdl sdl-2

我不想为SDL_Window和SDL_Renderer以及任何纹理使用全局变量。

所以我在main()的顶部声明了窗口,渲染器和纹理,并将它们传递给我的init()函数:

   bool init(SDL_Window* &window, SDL_Renderer* &renderer, const int height, const int width)
{
    if (SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        std::cout << "SDL_Init() failed SDL error: " << SDL_GetError() << '\n';
        return false;
    }
    else
    {
        window = SDL_CreateWindow("SDL Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, 0);
        if (window == NULL)
        {
            std::cout << "SDL_CreateWindow() failed SDL error: " << SDL_GetError() << '\n';
            return false;
        }
        else
        {
            renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
            if (renderer == NULL)
            {
                std::cout << "SDL_CreateRenderer() failed SDL error: " << SDL_GetError() << '\n';
            }
        }
    }

    return true;

}

main()中的调用者:

if (!init(window, renderer, WINDOW_HEIGHT, WINDOW_WIDTH))
{
    std::cout << "init() failed SDL error: " << SDL_GetError() << '\n';
}

main()顶部的声明:

    SDL_Texture* texture{};
    SDL_Window* window{};
    SDL_Renderer* renderer{};
    int WINDOW_HEIGHT = 480;
    int WINDOW_WIDTH = 640;
如您在我的init()函数中所见,

它将窗口和渲染器作为参数,并将它们放入以下参数之一:SDL_Window *&window; 最初,我尝试将它们放入:SDL_Window *窗口; 但是,当程序返回到main()时,这将导致渲染器和窗口为空。

我不明白为什么我的初始方法不起作用,而是使用SDL_Window *&window;。确实有效

据我所知,window是指向名为SDL_Window的SDL结构的指针(具有地址的变量),因此,当我将window传递给参数SDL_Window * window时,它应该给该参数指定我声明的窗口的地址在main()中,因此对init()中的窗口所做的任何更改也应在main()中对其进行更改,但这不是真的,并且SDL_Window *&window作为参数最终具有所需的效果。

如果可能的话,有人可以解释为什么吗?

1 个答案:

答案 0 :(得分:0)

我认为由于这是我使用的第一个复杂库,我对如何以及何时创建对象的性质感到有些困惑。多亏了HolyBlackCat,您对我而言很明显。

SDL_CreateWindow给我的窗口指针一个指向创建的窗口的地址,我传递给init()的是默认的初始化指针。由于某种原因,我认为声明一个指向SDL_Window的指针也会在窗口的内存中创建一个空间,这很明显是由于指针的工作方式没有意义