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

时间:2013-07-28 05:38:18

标签: c++ vector stl

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

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

但似乎我不能这样做。

4 个答案:

答案 0 :(得分:4)

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循环:

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

答案 1 :(得分:3)

可以这样做:

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

请更准确地说明确切的错误。我怀疑也许整个问题是试图引用指向对象的指针&#34;。&#34;而不是&#34; - &gt;&#34;。

但是,一般来说:

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

  

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

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

std :: mem_fun适配器在其构造函数中获取指向函数的指针,并将指向对象的指针作为operator()的(第一个)参数。

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

至于你得到的错误,请记住你的vector是一个指针集合,所以你应该按如下方式调用这些函数:

objects[index]->foo();