小编Hon*_*onf的帖子

资源句柄 - 禁止默认构造函数?

所以,我一直在做一些图书馆开发并陷入两难境地.图书馆是私人的,所以我无法分享,但我觉得这可能是一个有意义的问题.

这种困境本身就是为什么库中的资源处理类没有默认构造函数的问题.该类处理特定的文件结构,这并不重要,但我们可以调用类Quake3File.

然后请求实现默认构造函数和"适当的"Open/Close方法.我的思路是RAII风格,即如果你创建了一个类的实例化,你必须给它一个它处理的资源.这样做可以确保任何和所有成功构造的句柄都有效,IMO可以消除一整类错误.

我的建议是保持一个(智能)指针,然后不必实现打开/关闭并打开一堆蠕虫,用户在免费商店创建类"打开"它并删除是你想要的时候"关闭"它.当它超出范围时,使用智能指针甚至会"关闭"它.

这就是冲突的来源,我喜欢模仿类的STL设计,因为这使我的类更容易使用.因为我正在创建一个基本上处理文件的类,如果我以std :: fstream为指导,那么我不确定是否应该实现默认构造函数.整个std :: fstream层次结构的事实让我指出是的,但我自己的想法是否定的.

所以问题或多或少都是:

  1. 资源句柄是否真的有默认构造函数?
    • 在处理文件的类上实现默认构造函数有什么好方法?只是将内部状态设置为无效状态,如果用户通过不给它资源而错过它,会导致未定义的行为吗?想要沿着这条路走下去似乎很奇怪.
  2. 为什么STL使用默认构造函数实现fstream层次结构?遗产原因?

希望我的问题得到理解.谢谢.

c++ default-constructor c++11

8
推荐指数
1
解决办法
335
查看次数

堆栈弹出操作可以在C++ 11中安全地返回值

因此,似乎在C++ 11中不再需要堆栈中.top和.pop的隔离.

也许我错过了一些东西,但是C++ 03和之前的问题是如果.pop要返回一个值,那么复制操作可能会在元素复制期间抛出异常.示例(代码示例取自此处):

template <class T>
    // T must have default ctor and copy assignment
class Stack
{
public:
    Stack();
    ~Stack();
    Stack(const Stack&);
    Stack& operator=(const Stack&);

    unsigned Count();   // returns # of T's in the stack
    void     Push(const T&);
    T        Pop();     // if empty, returns default-
                        // constructed T
    T        Top();     // For backwards compatibility
                        // 

private:
    T*       v_;        // pointer to a memory area big
                        //  enough for 'vsize_' T objects
    unsigned vsize_;    // the size …
Run Code Online (Sandbox Code Playgroud)

c++ stack exception move-semantics c++11

8
推荐指数
1
解决办法
488
查看次数