我有一点问题,因为我正在制作我的学校项目,我需要创建类似容器的东西,使用std :: list。
#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或string类型时,一切正常,但即使我写
,也会使用<A*>
cout << *something[0];
它不起作用。谢谢你的帮助:))
答案 0 :(得分:2)
您的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
。
答案 1 :(得分:1)
A
必须在cout
上“可显示”,因此您需要为operator<<
个对象声明A
:
ostream& operator<<(ostream& os, const A& a)
{
os << "a A object"; // send A attributes to os.
return os;
}
此外,请确保将A
对象发送到流,但不是指向它的指针。作为您的容器存储A*
,something[0]
是指向A
(A*
)的指针,因此您需要取消引用它:
cout << *(something[0]);