Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Last active June 3, 2026 10:37
Show Gist options
  • Select an option

  • Save sunmeat/bc1eeeca55bffe6fd9c87dacbadb5528 to your computer and use it in GitHub Desktop.

Select an option

Save sunmeat/bc1eeeca55bffe6fd9c87dacbadb5528 to your computer and use it in GitHub Desktop.
console cpp app logger example with singleton patterns
#include <iostream>
#include <string> // to_string
using namespace std;
class Logger {
static Logger* instance; // приватний статичний покажчик на єдиний екземпляр класу
int log_count = 0; // скільки разів відбувся запис рядка у файл
Logger(){} // конструктор - приватний (забороняє створювати об'єкти за межами класу)
// Logger() = delete; // так не вийде, бо тоді не можна буде створити об'єкт навіть всередині класу
public:
static Logger* get_instance() { // публічний статичний геттер для отримання адреси єдиного об'єкта
// якщо об'єкт журналу не існує - він створюється
return instance == nullptr ? instance = new Logger : instance;
}
void write(string message) { // записати в журнал рядок тексту
log_count++;
cout << log_count << ": " << message << "\n";
// записати рядок у файл за допомогою fopen_s
FILE* file;
if (fopen_s(&file, "log.txt", "a") == 0 && file != nullptr) {
fprintf(file, "%s\n", message.c_str());
fclose(file);
}
}
void write(int value) {
write(to_string(value));
}
};
Logger* Logger::instance;
class HardProcessor { // клас, який виконує складні обчислення, дії якого треба логувати
int start;
public:
HardProcessor(int start) {
this->start = start;
Logger::get_instance()->write("процесор було створено."); // логування початку роботи
}
int process_to(int end) {
int sum = 0;
for (int i = start; i <= end; i++) {
sum += i;
Logger::get_instance()->write("виконується обчислення...");
Logger::get_instance()->write(i);
}
Logger::get_instance()->write("процесор щойно обчислив значення: ");
Logger::get_instance()->write(sum);
return sum;
}
};
class Program { // демо-клас
public:
static void do_hardwork() {
auto logger = Logger::get_instance();
HardProcessor processor(1); // початок діапазону
logger->write("розпочато складну обробку..."); // перший запис у журнал
processor.process_to(5); // кінець діапазону
logger->write("складна обробка завершена!"); // останній запис у журнал
}
};
int main() {
// setlocale(0, "Ukrainian");
Program::do_hardwork(); // виклик статичного методу (об'єкт тут не потрібен)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment