Как вызвать метод через вектор? - PullRequest
1 голос
/ 14 мая 2010

Как мне вызвать метод объекта, который хранится в векторе? Сбой следующего кода ...

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

Код возвращает следующую ошибку:

test3.cpp: 47: ошибка: запрос на член "printOutput" в ‘* it .__ gnu_cxx :: __ normal_iterator <_Iterator, _Container> :: operator-> с _Iterator = ClassA **, _Container = std :: vector> ’, который имеет неклассовый тип type ClassA * ’

Проблема, похоже, it->printOutput();, но на данный момент я не знаю, как правильно вызвать метод, кто-нибудь знает?

С уважением, Майки

Ответы [ 2 ]

13 голосов
/ 14 мая 2010

Вещи в векторе являются указателями. Вам нужно:

(*it)->printOutput();

, который разыменовывает итератор для получения указателя от вектора, а затем использует -> на указателе для вызова функции. Синтаксис, который вы показываете в своем вопросе, сработал бы, если бы вектор содержал объекты, а не указатели; в этом случае итератор действует как указатель на один из этих объектов.

0 голосов
/ 14 мая 2010

Существует библиотека Boost.PointerContainer , которая может вам здесь чрезвычайно помочь.

Во-первых: он заботится об управлении памятью, поэтому вы не забудете релиз, на который указала память.
Второе: он предоставляет интерфейс с «разыменованием», так что вы можете использовать итераторы без некрасивых патчей (*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();
}

С точки зрения внедрения зависимостей вы, возможно, захотите, чтобы printOutput принял параметр std::ostream&, чтобы вы могли направить его в любой поток, который вам нужен (по умолчанию он мог бы std::cout)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...