подклассы Singlton |
Здравствуйте, гость ( Вход | Регистрация )
подклассы Singlton |
call_me_Frank |
25.2.2015, 13:50
Сообщение
#1
|
Студент Группа: Участник Сообщений: 73 Регистрация: 20.10.2010 Пользователь №: 2129 Спасибо сказали: 0 раз(а) Репутация: 0 |
Привет!
не могу найти примера того, как нужно использовать подклассы Singlton'а Мейерса. суть задачи проста: нужен абстрактный класс логгера, и несколько его реализаций - для файловой системы, для БД, для консоли и т.д. Конечно, сам Логгер на всю программу должен быть в ед. экземпляре. Вот чего-то я запутался в этих трех соснах. Help me, please! |
|
|
Iron Bug |
25.2.2015, 15:18
Сообщение
#2
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
как-то непонятно, чего ты хочешь. singleton всегда имеет один экземпляр. что значит "несколько реализаций"?
|
|
|
call_me_Frank |
25.2.2015, 15:44
Сообщение
#3
|
Студент Группа: Участник Сообщений: 73 Регистрация: 20.10.2010 Пользователь №: 2129 Спасибо сказали: 0 раз(а) Репутация: 0 |
я планирую сделать так:
наследовать от QObject (юзаю Кьют) некий базовый подкласс (от которого наследовать остальные классы), в котором объявлен логгер, и потом где-то как-то выбирать конкретный логгер, используемый приложением:
FILE_LOGGER, DB_LOGGER & CONSOLE_LOGGER - соответственно, являются наследниками класса LOGGER с переопределенными методами log(const QString &msg); появилось мнение, что с Мейерсом такой вариант не прокатит, и нужно использовать реализацию синглтона с указателем? или я вообще не в ту степь повернул?) Сообщение отредактировал call_me_Frank - 25.2.2015, 15:46 |
|
|
Iron Bug |
25.2.2015, 15:55
Сообщение
#4
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
ты пытаешься применить паттерн фабрики к синглтону. про паттерны можешь почитать здесь: http://www.wiki.crossplatform.ru/index.php/Design_Patterns
посмотри "Фабричный метод". там примерно то, что ты пытаешься изобразить, насколько я понимаю. |
|
|
call_me_Frank |
25.2.2015, 16:17
Сообщение
#5
|
Студент Группа: Участник Сообщений: 73 Регистрация: 20.10.2010 Пользователь №: 2129 Спасибо сказали: 0 раз(а) Репутация: 0 |
именно!
так я и читаю книжку по паттернам, отсюда и мысли о таких решениях приходят. по-отдельности разобрал и тот, и другой паттерн, как их совместить - пока не понимаю. Собственно, я не могу понять: все классы (LOGGER & FILE_LOGGER, DB_LOGGER, ...) должны быть реализованы как Singleton, или не все? если FILE_LOGGER, наследует LOGGER и в классе BASE я использую интерфейс класса LOGGER, значит надо прописать в нем виртуальную ф-ию log(QString), для того, что бы переопределить её в FILE_LOGGER. Но если класс LOGGER является Singlton'ом, то значит ф-ия log() должна быть static...вот какие противоречия роятся у меня в голове |
|
|
call_me_Frank |
25.2.2015, 17:26
Сообщение
#6
|
Студент Группа: Участник Сообщений: 73 Регистрация: 20.10.2010 Пользователь №: 2129 Спасибо сказали: 0 раз(а) Репутация: 0 |
решил!
пригодна такая реализация? сделал, порадовался...теперь засомневался и появился вопрос: как развязать классы по отдельным h-файлам? получается зацикленное включение хедеров Сообщение отредактировал call_me_Frank - 25.2.2015, 17:55 |
|
|
call_me_Frank |
25.2.2015, 18:41
Сообщение
#7
|
Студент Группа: Участник Сообщений: 73 Регистрация: 20.10.2010 Пользователь №: 2129 Спасибо сказали: 0 раз(а) Репутация: 0 |
Вот еще один вариант реализации с помощью шаблонов:
и вызов:
что скажете? |
|
|
Iron Bug |
25.2.2015, 19:02
Сообщение
#8
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
насчёт решения с классами - какое-то оно странное. честно говоря, непонятно, как это будет использоваться. подумай ещё. это полезно. и обязательно попробуй использовать свои классы, без этого ты не поймёшь потенциальных минусов своего решения.
и появился вопрос: как развязать классы по отдельным h-файлам? получается зацикленное включение хедеров это стандартное решение в С/C++. каждый хэдер всегда заключён в блок препроцессорных определений:
и ещё: лучше не использовать имена переменных, начинающиеся с двух подчёркиваний ( __ ) - часто это зарезервированные имена служебных переменных и функций и можно случайно напороться на конфликт с определениями в стандартных библиотеках. |
|
|
wiz29 |
25.2.2015, 19:11
Сообщение
#9
|
Старейший участник Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: 12 |
не совсем понятно, зачем этот огород?
qDebug() все эти вещи решает вполне прозрачно, или любой другой подобный объект. Вывод всегда можно направить в нужное место. и появился вопрос: как развязать классы по отдельным h-файлам? получается зацикленное включение хедеров обычно так решают:
Сообщение отредактировал wiz29 - 25.2.2015, 19:14 |
|
|
Iron Bug |
25.2.2015, 19:11
Сообщение
#10
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
|
|
|
Текстовая версия | Сейчас: 4.12.2024, 22:54 |