我的ClassA类中的所有成员变量和成员函数都是静态的。
如果用户(错误地)尝试创建此类的对象,则会收到警告:“ClassA,本地变量从未引用”,因为所有函数都是静态的,因此永远不会引用此对象。所以,我想阻止用户尝试创建这个类的对象。
创建私有默认(无变量)构造函数是否足够?或者我是否还必须创建私有拷贝构造函数和私有赋值运算符(以防止使用默认构造函数)?如果我也必须创建它们,也许最好只创建一些虚拟纯虚函数,这会阻止用户创建一个对象?
谢谢
答案 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)
防止创建非堆对象的最佳方法是将析构函数设为私有。那么当编译器超出范围时,编译器就无法破坏该对象,它会抱怨。 但这不会阻止任何人做新事。