Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 更改一个指针后,将更改“乘法”对象_C++_Sdl_Sdl 2 - Fatal编程技术网

C++ 更改一个指针后,将更改“乘法”对象

C++ 更改一个指针后,将更改“乘法”对象,c++,sdl,sdl-2,C++,Sdl,Sdl 2,我只是在做一个简单的任务。但是我被卡住了。 任务很简单,只需使用SDL2来创建一个输入映射系统。我创建了一个按钮结构,其中包含按钮的名称、矩形和指定键 vector<Button>buttons = { Button("up", SDL_Rect{ 100,100,100,20 },"Up"), Button("down", SDL_Rect{ 100,200,100,20 },"Down"), Button("left", SDL_Rect{ 100,

我只是在做一个简单的任务。但是我被卡住了。 任务很简单,只需使用SDL2来创建一个输入映射系统。我创建了一个按钮结构,其中包含按钮的名称、矩形和指定键

vector<Button>buttons = {
     Button("up", SDL_Rect{ 100,100,100,20 },"Up"),
     Button("down", SDL_Rect{ 100,200,100,20 },"Down"),
     Button("left", SDL_Rect{ 100,300,100,20 },"Left"),
     Button("right", SDL_Rect{ 100,400,100,20 },"Right"),
     Button("reset", SDL_Rect{ 400,400,100,20 },"R")
};
您可以在下面看到断点调试。所有先前分配给btClicked的按钮都已更改。但btClicked只是指向其中一个按钮。


有人知道这里发生了什么吗?请提供帮助。

SDL\u GetKeyName
的返回值指向的字符串只保证在下次调用
SDL\u GetKeyName
之前有效。在本例中,它看起来有一个静态缓冲区,每次调用都会重复使用,因此所有的
按钮都指向同一个字符串。这意味着您需要复制该字符串,如果您需要它保持更长的有效期

实现这一点的最简单方法是将
按钮::分配的_键
成员设置为
std::string
而不是原始
const char*


无论如何,这几乎总是个好主意,因为在对象中保留
const char*
成员会混淆所有权语义,使应用程序更容易发生此类错误和内存泄漏。

SDL\u GetKeyName
返回值指向的字符串只保证在下次调用
SDL\u GetKeyName
之前有效。在本例中,它看起来有一个静态缓冲区,每次调用都会重复使用,因此所有的
按钮都指向同一个字符串。这意味着您需要复制该字符串,如果您需要它保持更长的有效期

实现这一点的最简单方法是将
按钮::分配的_键
成员设置为
std::string
而不是原始
const char*


无论如何,这几乎总是一个好主意,因为在对象中保留
const char*
成员会混淆所有权语义,使应用程序更容易发生此类错误和内存泄漏。

这正是问题所在。非常感谢。这正是问题所在。多谢各位。
if (evt.type == SDL_MOUSEBUTTONDOWN)
{   
    int x, y;
    SDL_GetMouseState(&x, &y);
    for (auto &b : buttons)
    {
        if (x > b.btn_rect.x && x<(b.btn_rect.x + b.btn_rect.w) && y > b.btn_rect.y && y < (b.btn_rect.y + b.btn_rect.h))
        {
            cout << "Button " << b.btn_name << " clicked" << endl;
            btClicked = &b;
            break;
        }
    }
}
if (evt.type == SDL_KEYDOWN)
{
    if(btClicked!=NULL)
    {
        btClicked->assigned_key = SDL_GetKeyName(evt.key.keysym.sym);//breakpoint here
        btClicked = NULL;
    }