#include <iostream>
class Singleton {
public:
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
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.setData(42);
std::cout << "\nAfter setData(42) via instance1:" << std::endl;
instance2.printInfo();
instance2.setData(100);
std::cout << "\nAfter setData(100) via instance2:" << std::endl;
instance1.printInfo();
std::cout << "\nDirect getData(): " << Singleton::getInstance().getData() << std::endl;
return 0;
}