调用存储在向量中的对象的成员函数
Calling member functions of an object stored in a vector
这听起来像是一个新手问题。如何调用存储在向量中的对象的成员函数?据推测,我有这样的课程:
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();
- 如何创建对象函数指针C++映射?
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 如何将对象函数的实例传递给另一个函数
- 调用模板函数的问题"No matching function for call"参数:迭代器、对象函数
- makefile对我的名称空间对象/函数/构造函数的不确定引用
- 将对象函数转换为函数指针
- 非对象函数/类函数C++
- 线程对象函数 C++
- C 将成员对象函数分配给类成员功能
- 使用基本指针调用派生对象函数
- 可以(通过编译器)使用多少个线程来初始化全局对象(函数main之前)
- C++类对象函数
- 对对象::函数的未定义引用
- 无法弄清楚将多个对象函数作为单独的线程调用的语法
- 在提升作用域出口中调用对象函数
- 使用基指针来使用派生对象函数
- 在for_each lambda 中调用对象函数
- C++:: 模板函数 - 从对象函数获取对象的地址
- Qt5 未解析的外部静态元对象函数
- 通过变量使用对象和对象函数