2010-12-08 98 views
2

我想使用C++迭代器的接口,但沒有設法使其工作。C++迭代器,接口和指針

我有點迷路了什麼類型的矢量內容選擇。這需要成爲一個指針嗎?我必須做出一個「新的實現()」嗎?簡而言之,我不清楚,而且我也找不到有用的例子。

這裏是接口和實現(.h文件)。

class Interface{ 
public: 
virtual int method() = 0; 
}; 

class Implementation1 : public Interface{ 
    public: 
    int method(); 
}; 

class Implementation2 : public Interface{ 
    public: 
    int method(); 
}; 

.cpp文件:

#include "content.h" 

int Implementation1::method(){ 
    return 1; 
} 

int Implementation2::method(){ 
    return 2; 
} 

而我的主要功能:

#include "content.h" 
#include <vector> 
#include <iostream> 

using namespace std; 

int main(void) 
{ 
    // create the vector and put elements in it 
    vector<Interface*> elements; 
    elements.push_back(new Implementation1()); 
    elements.push_back(new Implementation1()); 
    elements.push_back(new Implementation2()); 

    // now iterate on them 

    vector<Interface*>::iterator iterator; 
    for(iterator = elements.begin(); iterator != elements.end(); ++iterator){ 
     *iterator->method(); 
    } 

    return 1; 
} 

的compilator的輸出:

main.cpp: In function ‘int main()’: main.cpp:19: error: request for member ‘method’ in ‘* iterator.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator-> with _Iterator = Interface**, _Container = std::vector >’, which is of non-class type ‘Interface*’

約我什麼任何想法在這裏做錯了嗎?

+0

「不工作」是什麼意思? – kennytm 2010-12-08 19:05:34

+0

這是編譯失敗,是的。我已經添加了g ++的輸出。 – 2010-12-08 19:07:26

回答

11

變化*iterator->method();(*iterator)->method();

前者解除引用iterator-的返回>()的方法。接口*沒有方法(),它沒有任何東西。

你想取消引用迭代器到達你的指針,然後取消引用它。

你已經基本上得到了與迭代器**相同的東西,所以相應地採取行動。

+3

詳細說明:` - >`優先於`*`,與'2 * 2 + 2'中`*`相比,優先級高於'+'。 – Thanatos 2010-12-08 19:12:34

0

嘗試(*iterator)->method();

0

沒有什麼對你做了什麼,但創建原始指針的載體通常是一個壞主意本身無效,則應使用所有權強制執行指針(一種「智能」指針)一樣的shared_ptr 。而且你也不需要去引用迭代器,它應該直接提供 - > method()。然而,我沒有看到任何直接無法編譯的代碼,除了可能是你的*iterator->method(),因爲上次我檢查去引用的優先級非常低,你可能會做*(iterator->method())這是不可編譯的。

+0

雖然關於讓原始指針的向量在錯誤傾向性方面次優(與智能指針的向量相比)是正確的,但建議在不需要的情況下引用計數的智能指針是不酷的(並且sub - 效率最佳,但仍然不好)。有更好的解決方案:`boost :: ptr_vector`或像`unique_ptr`(C++ 0x)這樣的智能指針的普通向量。 – Kos 2010-12-08 19:16:55

2

諾亞關於編譯錯誤與迭代器+1,這是一個很好的解釋。至於你以前的問題:

I'm a bit lost with what type to choose for the vector contents. Is this need to be a pointer ? do I have to make a "new Implementation()"?

是的,這必須是一個指針。原因很簡單:類型T的向量只存儲(並擁有)T類型的元素,而不是子類型 - 並且有充分的理由(如果子類具有不同的大小?)。

因此,您必須將對象存儲在某處並將指針保留在向量中。事實上,通過operator new將它們存儲在免費商店是最簡單的選擇。

如果你想讓自己的生活更輕鬆一點,你可以使用boost::ptr_vector來達到你的目的。