2010-05-14 8 views
1

벡터에 저장된 객체의 메서드를 어떻게 호출합니까? 다음 코드는벡터를 통해 메서드를 호출하는 방법은 무엇입니까?

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: 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*’

문제는 it->printOutput(); 것 같다을하지만 순간에 나는 어떻게 제대로 메소드를 호출하는 방법을 알고하지 않습니다, 아는 사람 있나요?

관련 사항 mikey

답변

13

벡터의 내용은 포인터입니다. 당신이 필요합니다 반복자를 역 참조

(*it)->printOutput(); 

는 벡터에서 포인터를 얻기 위해, 다음 사용 -> 포인터에 함수를 호출 할 수 있습니다. 벡터에 포인터가 아닌 객체가 포함 된 경우 질문에 표시되는 구문이 작동합니다.이 경우 반복기는 해당 객체 중 하나에 대한 포인터처럼 작동합니다.

+0

작품 당신이 원하는대로 스트림에 지시 할 수 있도록

보기의 의존성 주입 지점에서
#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& 매개 변수를 고맙습니다! –

+0

루프에 대한 수치가 더 쉬운 해결책이었을 것입니다. 반복자는 알고리즘의 경우에만 대다수의 경우 실제 반복을 위해 존재할 필요는 없습니다. – Puppy

+0

@DeadMG 흥미 롭습니다 - 반복자를 사용하지 않고 어떻게 목록이나지도를 반복합니까 (예 :)? –

0

여기에 대단히 도움이 될 Boost.PointerContainer 라이브러리가 있습니다.

첫 번째 : 메모리 관리를 담당하므로 메모리가 가리키는 릴리스를 잊지 않을 것입니다.
둘째 : "dereferenced"인터페이스를 제공하므로 추악한 패치없이 반복자를 사용할 수 있습니다 (*it)->. 당신은 (그것을 완벽하게 std::cout에 기본 수)

+0

여기에 "Dependency Injection"이 없습니다 - 이것은 C++입니다! "함수에 값 전달"이라고 부릅니다 –

+0

나는 당신의 의견을 정말로 이해하지 못합니다 Neil, 정적으로 객체에 액세스하는 대신 객체에 대한 참조? 왜 C++에이 용어를 적용 할 수 없는지 이해할 수 없거나 유행어를 혐오스럽게 생각합니까?)? –

관련 문제