2015-12-24 47 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