C++
Beginner
1 min read
Static Members and the Singleton Pattern
Example
#include <iostream>
#include <string>
class Logger {
public:
// C++11 thread-safe local-static Singleton
static Logger& getInstance() {
static Logger instance; // constructed once, destroyed at program exit
return instance;
}
void log(const std::string& msg) {
++messageCount_;
std::cout << "[LOG #" << messageCount_ << "] " << msg << "\n";
}
int messageCount() const { return messageCount_; }
// Delete copy/move to enforce singleton semantics
Logger(const Logger&) = delete;
Logger& operator=(const Logger&) = delete;
private:
Logger() : messageCount_(0) {
std::cout << "Logger initialised\n";
}
int messageCount_;
};
class Config {
public:
static constexpr int MAX_RETRIES = 3;
static constexpr double TIMEOUT_SEC = 30.0;
static int instanceCount() { return count_; }
Config() { ++count_; }
~Config() { --count_; }
private:
static int count_; // definition in .cpp: int Config::count_ = 0;
};
int Config::count_ = 0;
int main() {
Logger::getInstance().log("Application started");
Logger::getInstance().log("Config loaded");
{
Config c1, c2;
std::cout << "Config instances: " << Config::instanceCount() << "\n";
}
std::cout << "Config instances: " << Config::instanceCount() << "\n";
std::cout << "MAX_RETRIES = " << Config::MAX_RETRIES << "\n";
return 0;
}