2014-03-04 167 views
1

我想从文件中读取数据,从数据创建批评,然后创建一个指向每个批评者的向量。在我读到第一批评的数据并将其设置为Criteria后,我有指针的向量

NightHawks *nightHawkPtr = &theCritic; 
criticPointer.push_back(nightHawkPtr); 

然后我尝试将它们打印出来。

for (int i = 0; i < criticPointer.size(); i++) 
    { 
     criticPointer[i]->text(); 
    } 

但是,每当指针被推回时,所有的指针指向相同的评论者。

+2

也许是因为你只声明了'theCritic'的一个实例,并且你正在改变它的值?你能告诉我们更多的代码吗? –

+1

我猜你只是修改'theCritic'并推送新的指针。所有这些指针都会保存相同的内存地址,从而指向可能是最后一个批评者的相同实例。 – ApplePie

+0

我认为这是问题,但我不知道如何解决,如果我从包含未知数量的批评者的输入文件阅读。 – user062495

回答

2

当你把它放在向量中时,你需要做一个新的评论。否则所有的数据都指向同一个内存位置。

criticPointer.push_back(new NightHawks(theCritic)); 

更好的是,不要存储指针只是存储批评价值的矢量。

2

从您的代码看来,您将所有指针值设置为一个实例,并且只是不断更改该实例。你必须每次变化值创建新实例:

NightHawks *nhp = new Critic(); 

如果您将它们插入到一个载体,我们强烈建议使用shared_ptrs,所以你不必担心释放内存。

2

它们指向同一个批评家,因为您将它们分配相同的变量theCritic

NightHawks *nightHawkPtr = &theCritic; 
criticPointer.push_back(nightHawkPtr); 

另外的地址,如果变量theCritic是一个局部变量,则程序可以有不确定的行为,因为一个指针变量becames局部变量被破坏后无效。

每次你建立一个批评类型的对象时,你应该在你应该使用运算符new的堆中构建它。

0

正如你在你的评论中提到的那样,I declare the critic like this NightHawks theCritic; and then i use getLine to read the input from the file and then I use setters to set the input to theCritic,你的问题是你正在改变同一个变量的内容。为不同的评论家创建新变量,分配给他们,然后将地址推入向量中。