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

passing SDL windows by reference/address

本文关键字:SDL 窗口 址传 地址 引用      更新时间:2023-10-16

我不想为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()时,这将导致呈现器和窗口为null。

我不明白为什么我最初的方法不起作用,而是使用SDL_Window*&Window;工作吗

据我所知,window是一个指向SDL_window结构的指针(一个保存地址的变量),因此当我将window传递给参数SDL_window*window时,它应该为参数提供我在main()中声明的窗口的地址,因此在init()中对窗口所做的任何更改也应该在main(;窗口作为参数最终达到了预期效果。

如果可能的话,有人能解释一下为什么会这样吗?

我认为由于这是我使用的第一个复杂库,我对如何以及何时创建对象的性质有点困惑。多亏了HolyBlackCat,你让我明白了这一点。

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