【问题标题】:For a static class (with private constructor) in C++, should I define a destructor?对于 C++ 中的静态类(带有私有构造函数),我应该定义一个析构函数吗?
【发布时间】:2013-01-19 20:55:20
【问题描述】:

我在 C++ 中有一个静态类,即这个类的所有成员都是静态的。

因为我不希望类被实例化,所以我将构造函数设为私有。 我没有为这个类定义一个默认的复制赋值运算符或复制构造函数,因为它永远不能被实例化。但是,我的静态代码分析器告诉我:

如果因为类管理资源而声明了析构函数,出于同样的原因,您可能还需要声明复制构造函数和复制赋值运算符。

-> 如果我不为这个类定义析构函数可以吗?既然它永远不能被创造,它也不能被摧毁,我想?

-> 这是一个好习惯吗?我的设计有什么问题吗?

【问题讨论】:

  • 是的,如果它永远无法被创建,它就永远无法被销毁。你的 dtor 里到底有什么?
  • 如果你不打算定义它,你可以删除对析构函数的声明,这可能是提示Rule of three声明的原因
  • 实际上,我只是将构造函数和析构函数声明为私有的......一种始终提供构造函数和析构函数声明的编码实践。但我想这不是必需的,对吧?
  • @kiki,如果是为了工作,请和他们谈谈。不过,您几乎永远不需要 dtor。 RAII 类将拥有它们,然后您使用这些 RAII 类而不是自己管理资源。
  • 如果类没有非静态数据成员或成员函数,则没有理由阻止某人创建该类型的对象。没有意义,但该对象将完全按照指定的方式工作。不要在这上面浪费时间。

标签: c++ static destructor


【解决方案1】:

因为我不希望类被实例化,所以我将构造函数设为私有。

如果你可以使用 C++11 编译器,你有一个更好的选择:你可以explicitly delete the "gratuitous" constructor provided by the compiler。这应该解决析构函数的问题,因为编译器会知道不可能构造您的类。

如果您不能使用已删除的构造函数功能,则将构造函数声明为私有应该足以防止外部实例化。析构函数不是必需的,因为没有什么可破坏的。

这是一个好习惯吗?我的设计有什么问题吗?

这种做法在无法定义独立函数/变量的语言中更为常见。另一方面,C++ 提供独立的函数和变量。这两个特性与命名空间的结合使得只有静态成员的类变得不必要:这样的类在功能上等同于命名空间,但对 C++ 来说不是惯用的。

【讨论】:

    猜你喜欢
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 2011-03-17
    • 2018-10-20
    • 2010-11-14
    相关资源
    最近更新 更多