C++ 如何通过向量调用方法?

C++ 如何通过向量调用方法?,c++,stl,vector,C++,Stl,Vector,如何调用存储在向量中的对象的方法?以下代码失败 ClassA* class_derived_a = new ClassDerivedA; ClassA* class_another_a = new ClassAnotherDerivedA; vector<ClassA*> test_vector; test_vector.push_back(class_derived_a); test_vector.push_back(class_another_

如何调用存储在向量中的对象的方法?以下代码失败

    ClassA* class_derived_a = new ClassDerivedA;
    ClassA* class_another_a = new ClassAnotherDerivedA;



  vector<ClassA*> test_vector;

  test_vector.push_back(class_derived_a);
  test_vector.push_back(class_another_a);

 for (vector<ClassA*>::iterator it = test_vector.begin(); it != test_vector.end(); it++)
    it->printOutput();
ClassA*CLASSE_derived_a=新的ClassDerivedA;
ClassA*CLASSE\U another\U a=新的ClassA或其他衍生产品;
向量测试;
测试向量。推回(类派生的);
测试向量。推回(类a);
for(vector::iterator it=test_vector.begin();it!=test_vector.end();it++)
它->打印输出();
代码检索以下错误:

test3.cpp:47:错误:请求 中的成员“printOutput”* 它.\uuuugnu\ucxx::\uuuunormal\uiterator::operator->with iterator=ClassA**,\ucontainer=std::vector>',其中 属于非类别类型“ClassA*”的

问题似乎是
it->printOutput()

关于mikey,向量中的东西是指针。你需要:

(*it)->printOutput();

它取消对迭代器的引用以从向量中获取指针,然后在指针上使用->调用函数。如果向量包含对象而不是指针,则问题中显示的语法将起作用,在这种情况下,迭代器就像指向其中一个对象的指针。

向量中的内容是指针。你需要:

(*it)->printOutput();
它取消对迭代器的引用以从向量中获取指针,然后在指针上使用->调用函数。如果向量包含对象而不是指针,那么您在问题中显示的语法将起作用,在这种情况下,迭代器就像指向其中一个对象的指针。

这里有一个库可以极大地帮助您

第一:它负责内存管理,因此您不会忘记内存指向的释放。
第二:它提供了一个“取消引用”的接口,这样您就可以使用迭代器,而不必进行难看的修补
(*it)->

#include <boost/ptr_container/ptr_vector.hpp>

int main(int argc, char* argv[])
{
  boost::ptr_vector<ClassA> vec;
  vec.push_back(new DerivedA());

  for (boost::ptr_vector<ClassA>::const_iterator it = vec.begin(), end = vec.end();
       it != end; ++it)
    it->printOutput();
}
#包括
int main(int argc,char*argv[])
{
boost::ptr_向量向量向量;
vec.推回(新的DerivedA());
对于(boost::ptr_vector::const_迭代器it=vec.begin(),end=vec.end();
它!=结束;++它)
它->打印输出();
}
从依赖注入的角度来看,您可能愿意让
printOutput
接受
std::ostream&
参数,这样您就可以将它指向您想要的任何流(它可以完全默认为
std::cout

这里有一个库可以极大地帮助您

第一:它负责内存管理,因此您不会忘记内存指向的释放。
第二:它提供了一个“取消引用”的接口,这样您就可以使用迭代器,而不必进行难看的修补
(*it)->

#include <boost/ptr_container/ptr_vector.hpp>

int main(int argc, char* argv[])
{
  boost::ptr_vector<ClassA> vec;
  vec.push_back(new DerivedA());

  for (boost::ptr_vector<ClassA>::const_iterator it = vec.begin(), end = vec.end();
       it != end; ++it)
    it->printOutput();
}
#包括
int main(int argc,char*argv[])
{
boost::ptr_向量向量向量;
vec.推回(新的DerivedA());
对于(boost::ptr_vector::const_迭代器it=vec.begin(),end=vec.end();
它!=结束;++它)
它->打印输出();
}

从依赖注入的角度来看,您可能愿意使用<代码> PrtSutoX采用<代码> STD::OsFooS/<代码>参数,以便您可以将它引导到任何您想要的流(它可以完全默认为<代码> STD::CUT)

请,这里没有“依赖注入”——这是C++!我们称之为“向函数传递值”。我真的不理解你的评论尼尔,依赖注入不是要传递对对象的引用,而不是静态地访问对象吗?我不明白为什么这个术语不能应用到C++…还是你讨厌这些流行语?拜托,这里没有“依赖注入”——这是C++!我们称之为“向函数传递值”。我真的不理解你的评论尼尔,依赖注入不是要传递对对象的引用,而不是静态地访问对象吗?我不明白为什么这个术语不能应用到C++…还是你讨厌这些流行语?在这里,数值for循环是更容易的解决方案。在绝大多数情况下,实际迭代不需要存在迭代器-仅用于算法。@DeadMG有趣-如何在不使用迭代器的情况下迭代列表或映射(例如)?您迭代映射或列表的频率是多少?如果您有一个新的BST或LL类,那么编写一个函数将给定的lambda或function对象应用于每个值并不困难,尽管遍历给定的std::map或std::list会很困难,因为它们使用迭代器作为提供此类功能的工具。像OP这样的例子正好说明了为什么它们应该被封装在库或类中——对于如此简单的用途,它们完全是OTT。我的编辑按钮去哪了(值得一提的是,auto和decltype使它们的使用比C++03编译器要简单得多。但是,对于简单的正向迭代,而不是随机访问或反向迭代,它们的使用仍然是不必要的。@DeadMG我不敢相信你一下子说不要使用迭代器,下一次说要使用lambdas。如果这就是你所说的,这几乎是不可能理解的。但是谁在乎呢?你已经被添加到我的“忽略”列表中了。在这里,一个数字for循环将是更容易的解决方案。迭代器在绝大多数情况下不必存在于实际的迭代中-仅用于算法。@DeadMG有趣的是-如何迭代列表或映射(例如)如果不使用迭代器?您多久迭代一次映射或列表?如果您有一个新的BST或LL类,那么编写一个函数将给定的lambda或function对象应用于每个值并不困难,尽管迭代给定的std::map或std::list会很困难,因为它们使用迭代器来提供此类功能像OP这样的例子正好说明了为什么它们应该封装在库或类中——对于如此简单的用途,它们完全是OTT。我的编辑按钮去哪儿了?:(值得一提的是,auto和decltype使它们的使用比在