用C++写一个继承单例模式的类
时间: 2023-11-15 13:06:38 浏览: 91
单例模式是一种设计模式,它保证一个类只有一个实例,并提供全局访问点。在C语言中,可以通过静态变量和函数来实现单例模式。
下面是一个继承单例模式的类的示例代码:
```c
#include <stdio.h>
// 基类
typedef struct {
int value;
} Singleton;
// 全局唯一实例
static Singleton *instance = NULL;
// 获取实例的函数
Singleton *get_instance() {
if (instance == NULL) {
// 第一次调用时创建实例
instance = (Singleton *) malloc(sizeof(Singleton));
instance->value = 0;
}
return instance;
}
// 继承自基类的子类
typedef struct {
Singleton base; // 基类的实例作为子类的成员变量
int extra_value;
} SubSingleton;
// 全局唯一子类实例
static SubSingleton *sub_instance = NULL;
// 获取子类实例的函数
SubSingleton *get_sub_instance() {
if (sub_instance == NULL) {
// 第一次调用时创建子类实例
sub_instance = (SubSingleton *) malloc(sizeof(SubSingleton));
sub_instance->base = *get_instance(); // 基类实例的值拷贝给子类实例
sub_instance->extra_value = 0;
}
return sub_instance;
}
int main() {
// 获取基类实例并修改值
Singleton *instance1 = get_instance();
instance1->value = 10;
printf("instance1 value: %d\n", instance1->value);
// 再次获取基类实例,应该和上一个实例是同一个
Singleton *instance2 = get_instance();
printf("instance2 value: %d\n", instance2->value);
// 获取子类实例并修改值
SubSingleton *sub_instance1 = get_sub_instance();
sub_instance1->extra_value = 5;
printf("sub_instance1 value: %d, extra_value: %d\n", sub_instance1->base.value, sub_instance1->extra_value);
// 再次获取子类实例,应该和上一个实例是同一个
SubSingleton *sub_instance2 = get_sub_instance();
printf("sub_instance2 value: %d, extra_value: %d\n", sub_instance2->base.value, sub_instance2->extra_value);
// 子类实例和基类实例应该是同一个
printf("sub_instance2 base value: %d\n", sub_instance2->base.value);
return 0;
}
```
在上面的代码中,基类Singleton定义了一个整数成员变量value,并通过get_instance函数实现单例模式。子类SubSingleton继承自基类,并添加了一个额外的整数成员变量extra_value。通过get_sub_instance函数实现子类的单例模式。
在main函数中,首先获取基类实例并修改value的值,然后再次获取基类实例,验证它们是同一个实例。接着获取子类实例并修改extra_value的值,然后再次获取子类实例,验证它们是同一个实例,并且子类实例和基类实例是同一个实例。
阅读全文