我有一个静态功能:
void TextManager::printDialogue(vector<Button*>* options, int optionsCount, vector<string> outputDisplayText)
{
active = true;
buttons = *options;
buttonsCount = optionsCount;
outputText = outputDisplayText;
}
“buttons”变量是静态的:
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*>
但它只是读取第一个变量。现在它没有读任何东西。有人可以帮忙吗?
答案 0 :(得分:1)
有一个名为buttons的静态成员变量,还有一个名为buttons的execute()内的局部变量。你应该重命名以避免混淆,否则,将使用局部变量而不是execute()中的静态成员变量。
答案 1 :(得分: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'不应该在全局范围内使用,除非变量属于类。 要使变量成为全局变量,您只需将其置于任何函数之外。要使类成员在该类的所有实例之间共享,请将其声明为静态,以便类知道所有实例共享一个变量。这是另一回事。 =)
如果你的代码被分成多个文件,为了使全局真正真正全局化,你必须在标题中声明它是'extern',而不是在一个源文件中声明extern,并且有其他源文件#include the标题,以此为止。略显笨重,但这就是它的完成方式。他们正在为它建立一个更好的系统,但它要标准化还需要几年时间。