crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> подклассы Singlton
call_me_Frank
  опции профиля:
сообщение 25.2.2015, 13:50
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 20.10.2010
Пользователь №: 2129

Спасибо сказали: 0 раз(а)




Репутация:   0  


Привет!

не могу найти примера того, как нужно использовать подклассы Singlton'а Мейерса.
суть задачи проста: нужен абстрактный класс логгера, и несколько его реализаций - для файловой системы, для БД, для консоли и т.д. Конечно, сам Логгер на всю программу должен быть в ед. экземпляре.

Вот чего-то я запутался в этих трех соснах. :blink: Help me, please!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
call_me_Frank
  опции профиля:
сообщение 25.2.2015, 17:26
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 20.10.2010
Пользователь №: 2129

Спасибо сказали: 0 раз(а)




Репутация:   0  


решил! 8)

// .H

#ifndef CLASS1_H
#define CLASS1_H

#include <iostream>

enum LOG_TYPE {LOG_C1 = 0, LOG_C2 = 1};

class class1;

class c1Dest
{
    class1 * _inst;
public:
    ~c1Dest();
    void init(class1 * p);
};

class class1
{
    static class1 * __inst;
    static c1Dest dest;

    static LOG_TYPE type;
protected:
    class1(){}
    class1(const class1&);
    class1& operator=(class1&);
    ~class1(){}

    friend class c1Dest;
public:
        static class1& instance();
    virtual void echo();
};

class class2 : public class1
{
public:
    void echo();
};

#endif // CLASS1_H


// .CPP

#include "class1.h"

LOG_TYPE class1::type = LOG_C1;

class1 * class1::__inst = 0;
c1Dest class1::dest;

c1Dest::~c1Dest(){
    delete _inst;
}

void c1Dest::init(class1 *p){
    _inst = p;
}

class1& class1::instance(){
    if (!__inst){
        switch (type){
            case LOG_C1: __inst = new class1; break;
            case LOG_C2: __inst = new class2; break;
        }
        dest.init(__inst);
    }
    return *__inst;
}

void class1::echo(){
    std::cout << "class1::echo() " << this << std::endl;
}

void class2::echo(){
    std::cout << "class2::echo() " << this << std::endl;
}


пригодна такая реализация? сделал, порадовался...теперь засомневался <_<

и появился вопрос: как развязать классы по отдельным h-файлам? получается зацикленное включение хедеров

Сообщение отредактировал call_me_Frank - 25.2.2015, 17:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- call_me_Frank   подклассы Singlton   25.2.2015, 13:50
- - Iron Bug   как-то непонятно, чего ты хочешь. singleton всегда...   25.2.2015, 15:18
- - call_me_Frank   я планирую сделать так: наследовать от QObject (ю...   25.2.2015, 15:44
- - Iron Bug   ты пытаешься применить паттерн фабрики к синглтону...   25.2.2015, 15:55
- - call_me_Frank   именно! так я и читаю книжку по паттернам, от...   25.2.2015, 16:17
|- - wiz29   Цитата(call_me_Frank @ 25.2.2015, 16:17) ...   25.2.2015, 19:25
- - call_me_Frank   решил! // .H #ifndef CLASS1_H #define CLAS...   25.2.2015, 17:26
|- - Iron Bug   насчёт решения с классами - какое-то оно странное....   25.2.2015, 19:02
- - call_me_Frank   Вот еще один вариант реализации с помощью шаблонов...   25.2.2015, 18:41
- - wiz29   не совсем понятно, зачем этот огород? qDebug() все...   25.2.2015, 19:11
|- - Iron Bug   Цитата(wiz29 @ 25.2.2015, 21:06) не совсе...   25.2.2015, 19:11
- - call_me_Frank   Постараюсь ответить по-порядку ) Iron Bug, спасиб...   25.2.2015, 22:40
|- - wiz29   Цитата(call_me_Frank @ 25.2.2015, 22:40) ...   26.2.2015, 17:53
- - lanz   ЦитатаПолучаются перекрестные ссылки, и я не нашел...   26.2.2015, 10:06
- - Iron Bug   в случае, если перекрёстные ссылки всё-таки есть (...   26.2.2015, 11:21


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.4.2024, 10:33