为什么下面不工作:为什么我无法创建std :: ifstreams的std :: stack?
#include <iostream>
#include <fstream>
#include <stack>
std::stack<std::ifstream> s;
-PT
为什么下面不工作:为什么我无法创建std :: ifstreams的std :: stack?
#include <iostream>
#include <fstream>
#include <stack>
std::stack<std::ifstream> s;
-PT
std::stack
(像所有的STL容器)要求其包含的类型是 “分配”。在STL中,这意味着它必须有一个拷贝构造函数和一个operator=
。 std::ifstream
既没有这些。
你可以想象为什么你不希望能够复制和分配I/O流;当存在两个相同流的副本时应该发生的语义并不明显。是否应该读取或写入一个副本影响另一个副本的位置?关闭一个流关闭另一个?等等。
如果你想拥有“一个容器std::ifstream
s”,那么你真正应该做的是“一个容器std::ifstream*
s”。非常量指针总是可赋值的。需要注意的是,在这种情况下,你必须确保在破坏容器之前删除指针,因为容器不会为你做。
但是,你可以有一堆ifstream指针:std :: stacked
杰出!谢谢。 - Prasoon – 2010-03-02 14:24:30
在这里备份泰勒(投票+1后)。
stl容器将复制到您给它们的对象的所有位置。如果你愿意,你可以通过给他们特殊的对象与精心制作的拷贝构造函数和具有引用计数和什么的破坏结构来处理这个问题。
一般来说,我觉得这太麻烦了。按照经验法则,只能在容器中使用小对象。如果您想制作一堆结构或类别,请使用指针代替它们。
作为我的经验法则:1)只编写实现复制的成员类(例如'std :: string',而不是'char *'),否则存储智能指针(并使确保该课程不可复制)。 – UncleBens 2010-03-02 14:03:09
即使你做了#1,在我的(通常是实时的)工作中,复制周围的大型对象或任何可能涉及动态分配/释放的东西都是不好的。 – 2010-03-02 14:51:57
在这种情况下,你可能使用特殊的内存池等(因为你不能动态分配指针),这使得C++的具体使用。你真的认为这是一个好的建议,为初学者避免'矢量
由于流不可复制,因此您可以将它们放入标准容器中。
但是我们可以通过存储指向流的指针来解决这个问题。但是你不想在标准容器中存储指向流的指针(特别是如果它们是动态分配的话)。所以我们希望提升解决方案。
Boost有指针容器的概念。
这允许您动态分配一个对象并将指针存储在指针容器中,该指针容器接受对象的所有权,并让您像访问对象(而不是指针)一样访问动态对象。
因为指针容器拥有所有权,所以您不必担心删除对象。容器会这样做。
因为它允许访问包含的对象作为对象而不是指针,它允许您在标准算法中以更自然的方式使用流(使用指针容器运行)。
在C++ 0x中,您将能够。 – 2010-03-02 14:14:33