假设我有一个名为TextEntry
的类,其中包含一些实例变量和一个方法ask()
(返回一个整数)。
std::vector<TextEntry*> d_text
的向量(类型为TextEntry
的指针向量)。我希望遍历此向量中的所有元素,并调用应用于每个元素的方法ask()
。这是正确的方法吗?
for (std::vector<TextEntry*>::iterator it = d_text.begin(); it != d_text.end(); ++it) {
TextEntry* TextEntryPointer = *it; // first dereference the iterator
TextEntry TextEntry = *TextEntryPointer; // dereference the TextEntry pointer
int j = TextEntry.ask();
}
无论出于何种原因,这个实现都给了我一个错误,所以知道原因是否是因为上面的代码或我项目其余部分的其他问题会有所帮助。
答案 0 :(得分:3)
我希望遍历此向量中的所有元素,并调用应用于每个元素的方法ask()。这是正确的方法吗?
几乎。
您的程序不会在ask
指向的任何元素上调用d_text
,而是在每个指向元素的副本上调用{<1}}。
我很困惑为什么它是副本。
您创建了TextEntry
类型的变量。您从*TextEntryPointer
复制初始化它。这就是为什么有副本。
有没有办法在原始元素上调用它?
是。您可以使用引用变量来代替复制构造TextEntry
变量:
TextEntry& TextEntry = *TextEntryPointer;
这是指向量中元素指向的对象。
或者更简单地说,根本不创建中间变量:
int j = TextEntryPointer->ask();
也许甚至不是指针:
int j = (*it)->ask();
您也可以简化循环:
for(TextEntry* ptr : d_text) {
int j = ptr->ask();
}
无论出于何种原因,这个实现都给了我一个错误
缺少分号
TextEntry TextEntry = *TextEntryPointer // dereference the TextEntry pointer
PS。避免使用与类型相同的标识符命名变量。
答案 1 :(得分:1)
一个有点假设的示例程序。 查看调用成员函数的main函数。
#include <iostream>
#include <vector>
using namespace std;
class TextEntry
{
public:
int ask()
{
return 1;
}
};
int main()
{
vector<TextEntry*> te;
TextEntry* te1 = new TextEntry();
TextEntry* te2 = new TextEntry();
TextEntry* te3 = new TextEntry();
TextEntry* te4 = new TextEntry();
te.push_back(te1);
te.push_back(te2);
te.push_back(te3);
te.push_back(te4);
for (std::vector<TextEntry*>::iterator it = te.begin(); it != te.end(); ++it)
{
TextEntry *t = *it;
cout<<t->ask();
}
}
答案 2 :(得分:1)
其他答案都是正确的。但我们现在有2016年,所以我们有c ++ 11:
for (auto& text_entry_ptr: d_text)
{
int j = text_entry_ptr->ask();
}
更简单,更清洁。