调用存储在向量中的对象的成员函数

Calling member functions of an object stored in a vector

本文关键字:对象 函数 成员 存储 向量 调用      更新时间:2023-10-16

这听起来像是一个新手问题。如何调用存储在向量中的对象的成员函数?据推测,我有这样的课程:

class A {
public:
void foo() {
std::cout << "Hello World"; }
};

然后我将一些对象存储在一个向量中:

std::vector<A*> objects;
A* b;
A* c;
A* d;
objects.push_back(b);
objects.push_back(c);
objects.push_back(d);

现在我想创建一个循环,其中存储在向量中的每个对象都会调用它自己的foo()函数。我该怎么做?一开始我以为我可以做这样的事情:

objects[2].foo();

但是我好像不能这样做。

std::vector::operator[]返回对std::vector中对象的引用。由于objects存储指向A的指针,因此应将其称为:

objects[2]->foo();

现在我想创建一个循环,其中存储在向量中的每个对象都会调用它自己的foo()函数。我应该怎么做这个

最简单的循环是:

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

使用C++11进行循环:

for(auto ep : objects)
{
    ep->foo();
}

或者for_each(不过需要写一个小lambda)

for_each(objects.begin(), objects.end(), [](A* ep){ep->foo(); });

旁注:在实践中,您最好将值存储在STL容器中。

std::vector<A> objects;
for(auto e : objects)
{
    ep.foo();    // call member function by "."
}

如果你想用STL容器存储指针,最好使用智能指针,例如

#include <memory>
std::vector<std::unique_ptr<A> > objects;
objects.push_back(new A());
objects.push_back(new A());
objects.clear(); // all dynamically allocated pointer elements will be de-allocated automatically

可以执行以下操作:

std::vector<A> objects;
A b;
A c;
A d;
objects.push_back(b);
objects.push_back(c);
objects.push_back(d);
objects[2].foo();

请详细说明具体的错误。我怀疑整个问题可能是试图引用一个指向带有"."而不是"->"的对象的指针。

但是是的,总的来说:

1) 您可以在任何STL容器中保存对象或指向对象的指针

2) 您可以在从容器访问该对象时调用该对象的任何公共方法。

您创建了指向类A的指针,而不是实例。因此,您应该使用指针语法访问方法foo。即

    for(int i = 0; i < 3; i++) {
      objects[i]->foo();
    }

在C++98和C++03中(由于其他答案已经告诉您如何在新标准中实现),您可以使用std::for_each和std::mem_fun adapter:

std::for_each(objects.begin(),objects.end(),std::mem_fun(&A::foo));

std::for_each将函数或函子应用于范围中的每个元素。

std::mem_fun适配器将指向其构造函数中函数的指针和指向对象的指针作为运算符()的(第一个)参数。

这将导致std::for_each在数组的每个元素上调用foo()成员函数。如果您的向量上有值而不是指针,则可以使用std::mem_fun_ref。

至于您得到的错误,请记住您的向量是指针的集合,因此您应该调用以下函数:

objects[index]->foo();