2010-05-14 123 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

作品,謝謝! – 2010-05-14 10:43:38

+0

循環的數字本來就是這裏比較容易的解決方案。在絕大多數情況下迭代器不需要存在實際的迭代 - 僅用於算法。 – Puppy 2010-05-14 12:51:21

+0

@DeadMG有趣 - 你如何迭代列表或地圖(例如),而不使用迭代器? – 2010-05-14 12:53:46

0

有一個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

+0

請在這裏沒有「依賴注入」 - 這是C++!我們稱之爲「將值傳遞給函數」 – 2010-05-14 12:48:18

+0

我不是很瞭解你的評論Neil,不是依賴注入來傳遞引用一個對象而不是靜態地訪問這個對象?我不明白爲什麼這個術語不能應用到C++中,或者你厭惡流行語;)? – 2010-05-14 16:00:38