防止创建其成员函数都是静态的类

Igo*_*Oks 9 c++ static constructor namespaces

我的类ClassA中的所有成员变量和成员函数都是静态的.

如果用户正在尝试(错误地)创建此类的对象,则会收到警告:"ClassA,本地变量从未引用",因为所有函数都是静态的,因此永远不会引用此对象.所以,我想阻止用户尝试创建这个类的对象.

是否足以创建一个私有默认(无变量)构造函数?或者我是否还必须创建私有拷贝构造函数和私有赋值运算符(以防止使用默认构造函数)?如果我也必须创建它们,也许最好只创建一些虚拟纯虚函数,这会阻止用户创建一个对象?

谢谢

Fer*_*cio 20

您可能最好不要在单独的命名空间中创建方法独立函数,而不是使用具有所有静态方法的类.调用语法是相同的:

namespace::function() 代替 classname::function()

并且您不需要与试图实例化您的课程的人打交道.


Jar*_*Par 11

创建私有默认构造函数就足够了.其他两个默认构造(复制构造函数和赋值)都依赖于实例正常工作.如果没有默认构造函数,则无法创建实例,因此无法实际访问复制构造部分.

虽然将所有3定义为私有而未实现,但它可能会为您节省一些麻烦.

  • 那应该是:声明但不定义(实现)构造函数.这将考虑尝试创建实例的外部代码(构造函数是私有的)和错误地创建对象的内部代码:未定义构造函数的链接器错误. (2认同)

Joh*_*itb 10

像其他人说的那样,你应该使用命名空间.如果你想留在你的班级,创建一个具有私有构造函数的类,并从中派生出来,以使你的意图显而易见:

class NonConstructible { 
    NonConstructible();
};

class SuperUtils: NonConstructible {
    static void foo();
    // ...
    static std::vector<int> globalIDs;
    // ...
};
Run Code Online (Sandbox Code Playgroud)

好的,现在让我们看一下命名空间,这是唯一的方法:

namespace SuperUtils {
    void foo() {
        // ....
    }

    std::vector<int> globalIDs;
};
Run Code Online (Sandbox Code Playgroud)

您可以SuperUtils::foo();在两种情况下都使用它,但命名空间的优点是在范围内您可以使用命名空间声明和指令将某些或所有成员带入当前范围,以便您可以在不使用SuperUtils::以下情况下引用它们:

void superFunction() {
    using namespace SuperUtils;
    foo();
}
Run Code Online (Sandbox Code Playgroud)

虽然通常应该避免这种情况,但是当该方法仅使用来自SuperUtils的大量内容时,它可能会有所帮助,从而可以提高代码的可读性.