我的 ClassA 类中的所有成员变量和成员函数都是静态的。
如果用户尝试(错误地)创建该类的对象,他会收到警告:“ClassA,从未引用局部变量”,因为所有函数都是静态的,因此永远不会引用该对象。因此,我想阻止用户尝试创建此类的对象。
创建一个私有默认(无变量)构造函数就足够了吗?或者我是否还必须创建私有复制构造函数和私有赋值运算符(以防止使用默认构造函数)?如果我也必须创建它们,也许只创建一些虚拟的纯虚函数会更好,这会阻止用户创建对象?
谢谢
我的 ClassA 类中的所有成员变量和成员函数都是静态的。
如果用户尝试(错误地)创建该类的对象,他会收到警告:“ClassA,从未引用局部变量”,因为所有函数都是静态的,因此永远不会引用该对象。因此,我想阻止用户尝试创建此类的对象。
创建一个私有默认(无变量)构造函数就足够了吗?或者我是否还必须创建私有复制构造函数和私有赋值运算符(以防止使用默认构造函数)?如果我也必须创建它们,也许只创建一些虚拟的纯虚函数会更好,这会阻止用户创建对象?
谢谢
与其使用具有所有静态方法的类,不如在单独的命名空间中使这些方法成为独立的函数。调用语法是一样的:
namespace::function()
代替classname::function()
而且您不需要与试图实例化您的类的人打交道。
创建一个私有的默认构造函数就足够了。其他两个默认构造(复制构造函数和赋值)都依赖于实例才能正常工作。如果没有默认构造函数,则无法创建实例,因此无法实际进入复制构造部分。
尽管将所有 3 个定义为私有且未实现,但它可能会为您省去一些麻烦。
就像其他人所说,命名空间是您应该使用的。如果您想保留您的类,请创建一个具有私有构造函数并从中派生的类,以使您的意图显而易见:
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 中的很多东西时,它会很有帮助,这样可以提高代码的可读性。
为了使用复制构造函数,你必须有一个要复制的对象,所以如果你锁定了默认构造函数,你应该是安全的。
防止创建非堆对象的最佳方法是将析构函数设为私有。然后编译器无法在超出范围时破坏对象并且它会抱怨。然而,这不会阻止任何人做新的事情。