开发者

How to call a method via a vector?

开发者 https://www.devze.com 2022-12-30 01:56 出处:网络
How do I call a method of an object which is stored within a vector? The following code fails... ClassA* class_derived_a = new ClassDerivedA;

How do I call a method of an object which is stored within a vector? The following code fails...

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

The code retrieves the following error:

test3.cpp:47: error: request for member ‘printOutput’ in ‘* it.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator-> with _Iterator = ClassA**, _Container = std::vector >’, which is of non-class type开发者_如何学编程 ‘ClassA*’

The problem seems to be it->printOutput(); but at the moment I don't know how to call the method properly, does anyone know?

regards mikey


The things in the vector are pointers. You need:

(*it)->printOutput();

which dereferences the iterator to get the pointer from the vector, then uses -> on the pointer to call the function. The syntax you show in your question would work if the vector contained objects rather than pointers, in which case the iterator acts like a pointer to one of those objects.


There is a Boost.PointerContainer library which could help you tremendously here.

First: it takes care of memory management, so you won't forget the release the memory pointed to.
Second: it provides a "dereferenced" interface so that you can use the iterators without the ugly patching (*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();
}

From a Dependency Injection point of view, you might be willing to have printOutput takes a std::ostream& parameter so that you can direct it to whatever stream you want (it could perfectly default to std::cout)

0

精彩评论

暂无评论...
验证码 换一张
取 消