2015-12-24 46 views
-1

我有一個小問題,因爲我正在做我的學校項目,我需要的是使用std ::列表創建類似容器女巫。顯示一個std ::列表<type*>

#include <iostream> 
#include <list> 

template<typename T> 
class SomeContainer 
{ 
    public: 
     SomeContainer &operator[](size_t i) ; 
     void push_back(const T &); 
     std::list<T> someContent_; 
} 

class A 
{ 
    //it doesn't matter whats inside 
} 

class B: public A 
{} 

class C: public A 
{} 

int main() 
{ 
    SomeContainer <A*> something_; 
    something_.push_back(new B); 
    cout<< something [0]; 
} 

我做了這樣的事情,有一個問題。我如何顯示A類內容,而不是指向它的指針?當我使用int或字符串類型,一切工作正常,但<A*>即使我寫

cout << *something[0]; 

它不會幫助:)

+0

什麼是你的錯誤? cout << some_instance_of_A工作嗎? (即你是否爲它實現了operator <<(ostream)? –

+1

爲什麼你的'operator []'返回容器類型而不是它包含的內容? – Galik

+1

你在生命早期就已經*寫幾個* small *,* separate *程序,讓你完全熟悉a)'std :: list ',b)指針和取消引用,c)重載'operator <<'。只有這樣才能建立一些複雜的東西。 –

回答

2

work.Thanks你operator[]必須有這樣的簽名:

T &operator[](size_t i); 
T const& operator[](size_t i) const; // possibly const overload 

你希望它的引用返回T類型的一個元素,而不是容器。但是,您需要遍歷std::list,而不是使用std::vector進行隨機訪問。

然後,您就可以:

cout << *something[0]; 

(假設你有operator<<A過載)。

+0

是的,謝謝你,我忘了operator << :) –

1

A必須在cout「顯示」,所以你需要爲A對象聲明operator<<

ostream& operator<<(ostream& os, const A& a) 
{ 
    os << "a A object"; // send A attributes to os. 
    return os; 
} 

此外,請確保您發送A對象到流,但不是一個指針。當你的容器存儲A*something[0]是一個指向AA*),所以你需要取消對它的引用:

cout << *(something[0]); 
+0

(我在另一個答案中弄錯了這個方法......)'*'的優先級低於'[]',所以你可以不用' (括號)',但明確顯示評估順序並不會造成影響。 :) –

+0

當然,我優先使用括號而不是去標準,並找出優先事項是什麼..... – jpo38