How to call a method via a vector?

前端 未结 2 1709
日久生厌
日久生厌 2020-12-21 22:12

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*         


        
相关标签:
2条回答
  • 2020-12-21 22:44

    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.

    0 讨论(0)
  • 2020-12-21 22:50

    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 讨论(0)
提交回复
热议问题