0

我有一个静态函数:

void TextManager::printDialogue(vector<Button*>* options, int optionsCount, vector<string> outputDisplayText)
{
    active = true;
    buttons = *options;
    buttonsCount = optionsCount;
    outputText = outputDisplayText;
}

“按钮”变量是静态的:

static vector<Button*>  buttons;

我在执行函数中调用 printDialogue:

void WorldDoor::execute()
{
    vector<Button*> buttons;

    buttons.push_back(new CancelButton());
    buttons.push_back(new ChangeRoomButton(room));

    TextManager::printDialogue(&buttons, 2, messages); //<----

    std::vector<Button*>::iterator i = buttons.begin();

    for ( i = buttons.begin() ; i < buttons.end(); i++ )
    {
        delete * i;
    }
}

无论出于何种原因,当我调试并在 printDialogue 函数内设置断点时,“按钮”中的值都非常好。但是,在我离开 printDialogue 后,我的按钮中包含的字符串从可读变为给我一条错误消息:

我尝试将指针传递给数组而不是使用

vector<Button*>

但它只是读取第一个变量。现在它什么也没读。有人可以帮忙吗?

4

2 回答 2

1

有一个静态成员变量叫做buttons,还有一个在execute()里面的局部变量叫做buttons。您应该重命名以避免混淆,否则将使用局部变量而不是 execute() 中的静态成员变量。

于 2013-06-14T20:25:09.903 回答
0

编辑:完全误解了这个问题。

当你这样做时:

vector<int*> vector1;
vector<int*> vector2;

vector1.push_back(new int(5));

vector2 = vector1;

它复制指针,而不是指针的。因此,当您稍后迭代第一个向量并删除动态内存时,两个向量都有指向您删除的同一内存的指针,因此您的第二个向量指向无效内存。

如果您使用的是 C++11,则可以使用唯一指针向量,并将 std::move() 一个向量放入另一个向量。否则,您可以在向量上调用“clear()”,而不删除内存。

以下是该函数的编写方式:

void TextManager::printDialogue(vector<Button*>* options, int optionsCount, vector<string> outputDisplayText)
{
    active = true;
    buttons = *options;
    options->clear(); //<--- Instead of crawling over it and delete-ing it.
    buttonsCount = optionsCount;
    outputText = outputDisplayText;
}

以下所有内容都是我对问题的误解:(包含其他可能重要的信息)

当你这样做时:

vector<Button*> buttons;

在函数内部,您正在创建一个名为 'buttons' 的新向量,该向量在函数调用结束时被销毁。

如果你想访问全局的,不要在函数内部创建一个新的,或者给它们命名不同的名字。

例子:

int myVar = 100; //Declares a variable called 'myVar' at global scope.

void func()
{
    int myVar = 200; //Declares a *different* variable called 'myVar' at function scope.
    std::cout << myVar << std::endl; //Prints the one inside the function, not the one outside it.
}

顺便说一句,变量 'static' 不应该在全局范围内使用,除非该变量属于一个 class。要使变量成为全局变量,只需将其放在任何函数之外。要在该类的所有实例之间共享一个类成员,请将其声明为静态,以便类知道所有实例共享一个变量。这是另一回事。=)

如果您将代码拆分为多个文件,要使全局真正成为真正的全局,您必须在头文件中声明它“extern”,而不是在一个源文件中声明它,并且有其他源文件#include 外部的头文件它。有点笨拙,但这就是它的完成方式。他们正在为它开发一个更好的系统,但要实现标准化还需要几年的时间。

于 2013-06-14T20:23:17.207 回答