单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在C++中,可以使用静态成员变量和静态成员函数来实现单例模式。
以下是一个在C++中实现单例模式的示例:
#include <iostream>
class Student
{
private:
std::string name;
int age;
static Student *instance;
Student(const std::string &_name, int _age) : name(_name), age(_age) {}
public:
static Student &getInstance()
{
if (instance == nullptr)
{
instance = new Student("meowrain", 12);
};
return *instance;
}
void print()
{
std::cout << "name: " << name << " age: " << age << std::endl;
}
void setName(const std::string &name)
{
this->name = name;
}
void setAge(int age)
{
this->age = age;
}
};
Student *Student::instance = nullptr;
int main(void)
{
Student stu = Student::getInstance();
stu.print();
}
当你在 Student 类中声明了一个静态成员变量 instance,它的类型是 Student*,这是一个指向 Student 类对象的指针。静态成员变量属于类而不是类的实例,因此它可以在类的所有实例之间共享。
在 getInstance() 函数中,你首先检查 instance 是否为 nullptr,如果是,则表示还没有创建过对象。在这种情况下,你使用 new 运算符创建一个新的 Student 对象,并将其指针赋值给 instance。
这样,第一次调用 getInstance() 时,会创建一个 Student 对象,并将其地址存储在 instance 中。之后的调用中,由于 instance 不再是 nullptr,直接返回存储在 instance 中的对象的指针。
在 main() 函数中,你通过调用 Student::getInstance() 获取单例对象的指针,并将其赋值给 stu。然后,通过 stu->print() 打印学生的信息,展示了如何使用单例对象。
这样的实现确保了只有一个 Student 对象的实例,并且可以通过静态成员函数 getInstance() 来获取该实例对象。其他成员函数如 setName() 和 setAge() 可以用来修改对象的属性值。
通过这种方式,你成功地实现了单例模式。只要你调用 getInstance(),你都会得到同一个 Student 对象的指针。