Вот делаю программу (Чистый WinApi, но вопрос не по нему, а по ООП):
В функции WinMain обьявлен класс CProgram
В в этом классе есть переменная CSettings
В CSettings есть CSettingsDialog
В CSettins есть функция, в которой объявлен класс CUpdate
Хочу сделать класс CLogFile (название говорит само за себя)
Нужно, чтоб он был доступен из всех классов.
То есть у него будет функция типа LogWrite(что она делает не имеет значение)
В функции WinMain хочу вызвать LogCreate
В классе CSettings несколько раз LogWrite()
В других классах тоже самое.
Здравствуйте, Calc, Вы писали:
C>Вот делаю программу (Чистый WinApi, но вопрос не по нему, а по ООП):
C>В функции WinMain обьявлен класс CProgram C>В в этом классе есть переменная CSettings C>В CSettings есть CSettingsDialog C>В CSettins есть функция, в которой объявлен класс CUpdate
C>Хочу сделать класс CLogFile (название говорит само за себя) C>Нужно, чтоб он был доступен из всех классов.
C>То есть у него будет функция типа LogWrite(что она делает не имеет значение)
C>В функции WinMain хочу вызвать LogCreate C>В классе CSettings несколько раз LogWrite() C>В других классах тоже самое.
C>Не представляю куда запихать CLogFile
Можно сделать что-то вроде общедоступного синглетона, примерно так
Здравствуйте, Calc, Вы писали:
C>Вот делаю программу (Чистый WinApi, но вопрос не по нему, а по ООП):
C>В функции WinMain обьявлен класс CProgram C>В в этом классе есть переменная CSettings C>В CSettings есть CSettingsDialog C>В CSettins есть функция, в которой объявлен класс CUpdate
C>Хочу сделать класс CLogFile (название говорит само за себя) C>Нужно, чтоб он был доступен из всех классов.
C>То есть у него будет функция типа LogWrite(что она делает не имеет значение)
C>В функции WinMain хочу вызвать LogCreate C>В классе CSettings несколько раз LogWrite() C>В других классах тоже самое.
C>Не представляю куда запихать CLogFile
В принципе можно воспользоваться паттерном singleton.
Что -то типа этого:
public Class CLogFile
{
private:
static ClogFile* instance = null;
protected:
CLogFile();
public:
static CLogFile* instance();
}
CLogFile::instance()
{
if ( null == instance )
{
instance = new LogFile();
}
return instance
}
В С++ коде могу немного ошибаться, но главное смысл.
Обращение К обекту класса происходит через статическую функцию( типа logFile = CLogFile::instance()). Это дает возможность обращаться к объекту в любой точке программы. Но при этом объект создется только один раз. Конструктор сделан protected чтобы нельзя было создать экземпляр класса в обход функции instance().
Здравствуйте, Calc, Вы писали:
C>Здравствуйте, Nicht, Вы писали:
N>Здравствуйте, Calc, Вы писали:
N>В принципе можно воспользоваться паттерном singleton. N>Что -то типа этого:
C>Ну это я понял, а дальше как? C>Как его использовать?
C>Теперь можно создавать несколько переменных-классов или как?
Здравствуйте, Ed.ward, Вы писали:
EW>Я ж написал как...
Сорри не заметил, но вот в этом и проблема.
Как сделать, чтоб CLogFile был виден например только в 3х классах?
Просто заголовочный файл включить в эти места?
(все классы раскиданы по разным файлам)
Здравствуйте, Calc, Вы писали:
C>Здравствуйте, Ed.ward, Вы писали:
EW>Я ж написал как...
C>Сорри не заметил, но вот в этом и проблема. C>Как сделать, чтоб CLogFile был виден например только в 3х классах? C>Просто заголовочный файл включить в эти места? C>(все классы раскиданы по разным файлам)
Здравствуйте, Calc, Вы писали:
C>Здравствуйте, Ed.ward, Вы писали:
C>Спасибо огромное заработало. C>Кстати в конце объявления класса вы забыли поставить ";"(точка с запятой)
Я счас почти на С++ не пишу, на С# все больше, а там ";" не нужна
Здравствуйте, MaximE, Вы писали:
ME>А нафига он тебе? Подключи хедер <iostream>:
ME>Там четыре глобальных объекта: cout, cerr, clog, cin (и их wide варианты). Перенаправь cout млм cerr в файл и пользуй на здоровье.
ME>
ME>#include <iostream>
ME>#include <fstream>
ME>int main()
ME>{
ME> using namespace std;
ME> // перенаправим clog в файл my.log
ME> ofstream log("my.log");
ME> streambuf* original_clog_buffer(clog.rdbuf(log.rdbuf()));
ME> clog << "My application has started successfully.\r\n";
ME> // ...
ME> clog << "My application shuting down...\r\n";
ME> // вернем clog оригинальный буфер
ME> clog.rdbuf(original_clog_buffer);
ME> return 0;
ME>}
ME>
Ну да!
У меня там класс на класе и с подклассом, перенаправлять заколебёшся
И слишком длинный код получается, вот еслиб писал без использования ООП, то да, а так нет.
Вызывать лог надо во всех классах, если сделать глобальную функцию, то это уже на ООП не очень смахивает.
А так новую технологию узнал.
Здравствуйте, Calc, Вы писали:
C>У меня там класс на класе и с подклассом, перенаправлять заколебёшся
Глобальные объекты потоков cout, clog, cerr, cin существуют в одном экзампляре (они — singleton'ы). Т.е. в каком бы модуле своей проги ты их не использовал, ты всегда работаешь с одним и тем же объектом. Так как объект потока один и состояние его одно, перенаправить нужно лишь один раз и где угодго (если это лог, то лучше это сделать в начале программы).
C>Вызывать лог надо во всех классах, если сделать глобальную функцию, то это уже на ООП не очень смахивает.
Вот и пиши во всех своих классах лог в объект clog. Не перенаправишь — все будут писать в консоль, перенаправишь — все будут писать куда скажешь, хоть в /dev/null .
Здравствуйте, MaximE, Вы писали:
ME>Глобальные объекты потоков cout, clog, cerr, cin существуют в одном экзампляре (они — singleton'ы). Т.е. в каком бы модуле своей проги ты их не использовал, ты всегда работаешь с одним и тем же объектом. Так как объект потока один и состояние его одно, перенаправить нужно лишь один раз и где угодго (если это лог, то лучше это сделать в начале программы).
Спасибо за настойчивость, теперь я возьмусь изучать C++ подробнее.
А вообще где можно почитать о синглетонах? Что то они меня сильно задели.
Какую книгу посоветуете прочитать?
Прочёл — Программирование на Borland C++, Герберт Шилд.
Книги:
1) Бьерн Страуструп Язык программирования С++
2) Джефф Элджер (Библиотека программиста) С++
И в каком порядке посоветуете прочитать?
ME>Вот и пиши во всех своих классах лог в объект clog. Не перенаправишь — все будут писать в консоль, перенаправишь — все будут писать куда скажешь, хоть в /dev/null .
Хех подпись мою в низу хорошо видно
То есть шутку не оценил. Не дошло до меня
Здравствуйте, Calc, Вы писали:
C>А вообще где можно почитать о синглетонах? Что то они меня сильно задели.
Книжка Design Patterns. Русское издание "Шаблоны проектирования"
C>Какую книгу посоветуете прочитать? C>Прочёл — Программирование на Borland C++, Герберт Шилд. C>Книги: C>1) Бьерн Страуструп Язык программирования С++ C>2) Джефф Элджер (Библиотека программиста) С++ C>И в каком порядке посоветуете прочитать?
Страуструп -> (opt.) Элджер -> Майерс -> Саттер -> Дьюхёрст -> Александреску -> Коплиен
ME>>Вот и пиши во всех своих классах лог в объект clog. Не перенаправишь — все будут писать в консоль, перенаправишь — все будут писать куда скажешь, хоть в /dev/null . C>Хех подпись мою в низу хорошо видно C>То есть шутку не оценил. Не дошло до меня
Здравствуйте, Calc, Вы писали:
C>Здравствуйте, MaximE, Вы писали:
ME>>Страуструп -> (opt.) Элджер -> Майерс -> Саттер -> Дьюхёрст -> Александреску -> Коплиен
C>Из всех авторов в книжных магазинах не нашёл только Дьюхёрст и Коплиен
Пока ты прочитаешь то, что нашел, найдутся и другие
Здравствуйте, Calc, Вы писали:
C>Здравствуйте, MaximE, Вы писали:
ME>>Страуструп -> (opt.) Элджер -> Майерс -> Саттер -> Дьюхёрст -> Александреску -> Коплиен
C>Из всех авторов в книжных магазинах не нашёл только Дьюхёрст и Коплиен