#include <iostream>

class Singleton {
public:
    // Delete copy constructor and assignment operator to ensure singleton cannot be copied
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

    // Global access point: returns reference to singleton instance (thread-safe since C++11)
    static Singleton& getInstance() {
        static Singleton instance;  // 首次调用时初始化,程序结束时自动销毁
        return instance;
    }

    // 示例业务方法:设置数据
    void setData(int value) {
        data_ = value;
    }

    // 示例业务方法:获取数据
    int getData() const {
        return data_;
    }

    // 打印实例地址和当前数据
    void printInfo() const {
        std::cout << "Singleton instance at: " << this
                  << ", data = " << data_ << std::endl;
    }

    // 析构函数(公有,以便静态对象正常销毁)
    ~Singleton() {
        std::cout << "Singleton destroyed." << std::endl;
    }

private:
    // 私有构造函数,防止外部直接创建实例
    Singleton() : data_(0) {
        std::cout << "Singleton constructed (data initialized to 0)." << std::endl;
    }

private:
    int data_;  // 示例数据成员
};

int main() {
    std::cout << "=== Singleton Pattern Demo ===" << std::endl;

    // 第一次获取实例:触发构造
    Singleton& instance1 = Singleton::getInstance();
    instance1.printInfo();

    // 第二次获取实例:返回同一对象
    Singleton& instance2 = Singleton::getInstance();
    instance2.printInfo();

    // 验证是否为同一实例(比较地址)
    if (&instance1 == &instance2) {
        std::cout << "✓ Both references point to the same instance. Singleton works!" << std::endl;
    } else {
        std::cout << "✗ Error: Different instances!" << std::endl;
    }

    // 通过 instance1 修改数据
    instance1.setData(42);
    std::cout << "\nAfter setData(42) via instance1:" << std::endl;
    instance2.printInfo();  // instance2 看到相同的数据

    // 通过 instance2 修改数据
    instance2.setData(100);
    std::cout << "\nAfter setData(100) via instance2:" << std::endl;
    instance1.printInfo();  // instance1 看到相同的数据

    // 直接通过访问点获取数据
    std::cout << "\nDirect getData(): " << Singleton::getInstance().getData() << std::endl;

    return 0;
}

results matching ""

    No results matching ""