我不想为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作为参数最终具有所需的效果。
如果可能的话,有人可以解释为什么吗?
答案 0 :(得分:0)
我认为由于这是我使用的第一个复杂库,我对如何以及何时创建对象的性质感到有些困惑。多亏了HolyBlackCat,您对我而言很明显。
SDL_CreateWindow给我的窗口指针一个指向创建的窗口的地址,我传递给init()的是默认的初始化指针。由于某种原因,我认为声明一个指向SDL_Window的指针也会在窗口的内存中创建一个空间,这很明显是由于指针的工作方式没有意义