这听起来像是一个新手问题。如何调用存储在向量中的对象的成员函数?据说,我有这个课程:
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();
但似乎我不能这样做。
答案 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();