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

时间:2008-12-09 17:17:55

标签: c++ static constructor namespaces

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

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

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

谢谢

5 个答案:

答案 0 :(得分:20)

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

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

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

答案 1 :(得分:11)

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

虽然将所有3定义为私有而未实现,但这可能会让您省去一些麻烦。

答案 2 :(得分:10)

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

class NonConstructible { 
    NonConstructible();
};

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

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

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

    std::vector<int> globalIDs;
};

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

void superFunction() {
    using namespace SuperUtils;
    foo();
}

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

答案 3 :(得分:3)

为了使用复制构造函数,你必须有一个要复制的对象,所以如果你已经锁定了默认构造函数,那么你应该是安全的。

答案 4 :(得分:0)

防止创建非堆对象的最佳方法是将析构函数设为私有。那么当编译器超出范围时,编译器就无法破坏该对象,它会抱怨。 但这不会阻止任何人做新事。