C++ 中可以使用 private
构造函数,来阻止类的实例化。通过这种方式,我们可以创建一个只能被继承而无法被实例化的类。下面是具体实现:
首先,我们创建一个名为 Singleton
的类,只能被继承,不能被实例化:
class Singleton {
protected:
Singleton() {}
~Singleton() {}
public:
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
static Singleton& GetInstance() {
static Singleton instance;
return instance;
}
};
在这里,我们使用了 protected
构造函数来防止该类被实例化。同时,我们还使用了 delete
操作符来删除复制构造函数和赋值构造函数,以防止复制该类的对象。
为了实现单例模式并返回该类的唯一实例,我们使用静态方法 GetInstance()
,创建了一个静态变量 instance
,这样,我们每次调用该方法时都可以返回类的唯一实例。
下面演示两个例子:
class Derived : public Singleton {
public:
Derived() {}
~Derived() {}
};
int main() {
// 无法通过构造函数实例化
// Singleton s; // error
// 可以通过继承获得实例
Derived& derived_1 = Derived::GetInstance();
Derived& derived_2 = Derived::GetInstance();
if (&derived_1 == &derived_2)
std::cout << "Two derived instances are same." << std::endl;
else
std::cout << "Two derived instances are different." << std::endl;
return 0;
}
在上面的代码中,定义了一个名为 Derived
的类,继承了 Singleton
类。在 main()
中,我们尝试通过构造函数实例化 Singleton
,但是编译器会报错。然后,我们通过 Derived::GetInstance()
获得了两个 Derived
的实例,并检查它们是否相同。由于 Derived
继承了 Singleton
,因此 Derived
类也无法被实例化,只能通过 GetInstance()
获取实例。
第二个例子:
class MyClass final : public Singleton {
public:
MyClass() {}
~MyClass() {}
};
// error, MyClass cannot be derived from
// class MyClassDerived : public MyClass {};
// error, MyClass cannot be inherited from
// class MyClassDerived final : public MyClass {
class MyClassDerived {
public:
MyClassDerived() {}
~MyClassDerived() {}
};
int main() {
// 无法通过构造函数实例化
// Singleton s; // error
// 可以通过继承获得实例
MyClass& my_class_1 = MyClass::GetInstance();
MyClass& my_class_2 = MyClass::GetInstance();
if (&my_class_1 == &my_class_2)
std::cout << "Two my_class instances are same." << std::endl;
else
std::cout << "Two my_class instances are different." << std::endl;
// MyClassDerived cannot inherit from MyClass
// MyClassDerived derived_1;
// MyClassDerived derived_2;
return 0;
}
在这个例子中,我们使用 final
修饰符防止 MyClass
被继承,也就是说,我们无法创建一个继承自 MyClass
的类。同时,我们也无法将其他类继承自 MyClass
。这样一来,我们就可以确保 MyClass
的唯一实例。
以上是关于 C++ 阻止类被实例化的详细讲解和示例说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++阻止类被实例化详解 - Python技术站