取消引用指向对象的指针的std::向量的每个元素

De-Referencing each element of an std::vector of pointers to objects

本文关键字:向量 元素 std 指针 引用 对象 取消      更新时间:2023-10-16

假设我有一个名为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();
}

不管出于什么原因,这个实现给了我一个错误,所以如果知道原因是因为上面的代码还是我项目其余部分的其他问题,那将是很有帮助的。

我希望迭代这个向量中的所有元素,并调用应用于每个元素的方法ask((。这是正确的方法吗?

差不多。

您的程序不会在d_text指向的任何元素上调用ask,而是在每个指向元素的副本上调用。


我不明白为什么它是一个副本。

您可以创建一个类型为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。避免使用与类型相同的标识符命名变量。

一个带有小假设的示例程序。查看用于调用成员函数的主函数。

 #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();
    }
}

其他答案都是正确的。但我们现在有2016年,所以我们有c++11:

for (auto& text_entry_ptr: d_text)
{
    int j = text_entry_ptr->ask();
}

更简单、更干净。