9

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

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

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

谢谢

4

5 回答 5

20

与其使用具有所有静态方法的类,不如在单独的命名空间中使这些方法成为独立的函数。调用语法是一样的:

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

而且您不需要与试图实例化您的类的人打交道。

于 2008-12-09T17:28:04.923 回答
11

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

尽管将所有 3 个定义为私有且未实现,但它可能会为您省去一些麻烦。

于 2008-12-09T17:19:54.097 回答
10

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

class NonConstructible { 
    NonConstructible();
};

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

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

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

    std::vector<int> globalIDs;
};

在这两种情况下都可以调用 using SuperUtils::foo();,但命名空间的优势在于,在作用域中,您可以使用命名空间声明和指令将某些或所有成员带入当前作用域,这样您就可以在不使用 using 的情况下引用它们SuperUtils::

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

虽然通常应该避免这种情况,但当该方法专门使用 SuperUtils 中的很多东西时,它会很有帮助,这样可以提高代码的可读性。

于 2008-12-09T17:54:26.477 回答
3

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

于 2008-12-09T17:20:00.790 回答
0

防止创建非堆对象的最佳方法是将析构函数设为私有。然后编译器无法在超出范围时破坏对象并且它会抱怨。然而,这不会阻止任何人做新的事情。

于 2008-12-10T08:35:36.823 回答