Расположение классов в проекте
От: Calc Россия  
Дата: 24.07.03 13:59
Оценка:
Вот делаю программу (Чистый WinApi, но вопрос не по нему, а по ООП):

В функции WinMain обьявлен класс CProgram
В в этом классе есть переменная CSettings
В CSettings есть CSettingsDialog
В CSettins есть функция, в которой объявлен класс CUpdate

Хочу сделать класс CLogFile (название говорит само за себя)
Нужно, чтоб он был доступен из всех классов.

То есть у него будет функция типа LogWrite(что она делает не имеет значение)

В функции WinMain хочу вызвать LogCreate
В классе CSettings несколько раз LogWrite()
В других классах тоже самое.

Не представляю куда запихать CLogFile
Re: Расположение классов в проекте
От: Ed.ward Россия  
Дата: 24.07.03 14:10
Оценка: 2 (2)
Здравствуйте, 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


Можно сделать что-то вроде общедоступного синглетона, примерно так

class CLogFile
{
public:
    static CLogFile *GetInstance()
    {
        if( NULL == s_Instance )
            s_Instance = new CLogFile;
        return s_Instance;
    }
    static void Write( TCHAR *message )
    {
        //TODO:
    }
private:
    static CLogFile *s_Instance;
}

CLogFile *CLogFile::s_Instance = NULL;


И в любом месте программы где виден CLogFile

CLogFile::GetInstance()->Write( "xz" );


Ed.ward
... << RSDN@Home 1.0 beta 7a >>
Re: Расположение классов в проекте
От: Bell Россия  
Дата: 24.07.03 14:15
Оценка:
Здравствуйте, Calc, Вы писали:

CC>Не представляю куда запихать CLogFile


Сделай его синглтоном.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Расположение классов в проекте
От: Calc Россия  
Дата: 24.07.03 14:21
Оценка:
Здравствуйте, Ed.ward, Вы писали:

EW>Можно сделать что-то вроде общедоступного синглетона, примерно так...


Бррр... не ругайтесь такими словами , еслиб я ещё знал что такое синглетон.
Но в общем идею понял, ща буду пробовать
Re: Расположение классов в проекте
От: Nicht Россия  
Дата: 24.07.03 14:25
Оценка:
Здравствуйте, 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().
Re[2]: Расположение классов в проекте
От: Calc Россия  
Дата: 24.07.03 14:43
Оценка:
Здравствуйте, Nicht, Вы писали:

N>Здравствуйте, Calc, Вы писали:


N>В принципе можно воспользоваться паттерном singleton.

N>Что -то типа этого:

Ну это я понял, а дальше как?
Как его использовать?

Теперь можно создавать несколько переменных-классов или как?
Re[3]: Расположение классов в проекте
От: Ed.ward Россия  
Дата: 24.07.03 14:48
Оценка:
Здравствуйте, Calc, Вы писали:

C>Здравствуйте, Nicht, Вы писали:


N>Здравствуйте, Calc, Вы писали:


N>В принципе можно воспользоваться паттерном singleton.

N>Что -то типа этого:

C>Ну это я понял, а дальше как?

C>Как его использовать?

C>Теперь можно создавать несколько переменных-классов или как?


Я ж написал как...

Ed.ward
... << RSDN@Home 1.0 beta 7a >>
Re[4]: Расположение классов в проекте
От: Calc Россия  
Дата: 24.07.03 14:57
Оценка:
Здравствуйте, Ed.ward, Вы писали:

EW>Я ж написал как...


Сорри не заметил, но вот в этом и проблема.
Как сделать, чтоб CLogFile был виден например только в 3х классах?
Просто заголовочный файл включить в эти места?
(все классы раскиданы по разным файлам)
Re[5]: Расположение классов в проекте
От: Ed.ward Россия  
Дата: 24.07.03 15:04
Оценка: 3 (1)
Здравствуйте, Calc, Вы писали:

C>Здравствуйте, Ed.ward, Вы писали:


EW>Я ж написал как...


C>Сорри не заметил, но вот в этом и проблема.

C>Как сделать, чтоб CLogFile был виден например только в 3х классах?
C>Просто заголовочный файл включить в эти места?
C>(все классы раскиданы по разным файлам)

да, подключить заголовок

Ed.ward
... << RSDN@Home 1.0 beta 7a >>
Re[6]: Расположение классов в проекте
От: Calc Россия  
Дата: 24.07.03 15:08
Оценка:
Здравствуйте, Ed.ward, Вы писали:

Спасибо огромное заработало.
Кстати в конце объявления класса вы забыли поставить ";"(точка с запятой)
Re: Расположение классов в проекте
От: MaximE Великобритания  
Дата: 24.07.03 15:17
Оценка:
Здравствуйте, Calc, Вы писали:

C>Не представляю куда запихать CLogFile


А нафига он тебе? Подключи хедер <iostream>:

Там четыре глобальных объекта: cout, cerr, clog, cin (и их wide варианты). Перенаправь cout млм cerr в файл и пользуй на здоровье.

#include <iostream>
#include <fstream>

int main()
{
    using namespace std;

    // перенаправим clog в файл my.log
    ofstream log("my.log");
    streambuf* original_clog_buffer(clog.rdbuf(log.rdbuf()));

    clog << "My application has started successfully.\r\n";

    // ...

    clog << "My application shuting down...\r\n";

    // вернем clog оригинальный буфер
    clog.rdbuf(original_clog_buffer);

    return 0;
}
Re[7]: Расположение классов в проекте
От: Ed.ward Россия  
Дата: 24.07.03 15:18
Оценка:
Здравствуйте, Calc, Вы писали:

C>Здравствуйте, Ed.ward, Вы писали:


C>Спасибо огромное заработало.

C>Кстати в конце объявления класса вы забыли поставить ";"(точка с запятой)

Я счас почти на С++ не пишу, на С# все больше, а там ";" не нужна

Ed.ward
... << RSDN@Home 1.0 beta 7a >>
Re[2]: Расположение классов в проекте
От: Calc Россия  
Дата: 24.07.03 15:33
Оценка:
Здравствуйте, 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>


Ну да!
У меня там класс на класе и с подклассом, перенаправлять заколебёшся
И слишком длинный код получается, вот еслиб писал без использования ООП, то да, а так нет.
Вызывать лог надо во всех классах, если сделать глобальную функцию, то это уже на ООП не очень смахивает.
А так новую технологию узнал.
Re[3]: Расположение классов в проекте
От: MaximE Великобритания  
Дата: 24.07.03 18:14
Оценка:
Здравствуйте, Calc, Вы писали:

C>У меня там класс на класе и с подклассом, перенаправлять заколебёшся


Глобальные объекты потоков cout, clog, cerr, cin существуют в одном экзампляре (они — singleton'ы). Т.е. в каком бы модуле своей проги ты их не использовал, ты всегда работаешь с одним и тем же объектом. Так как объект потока один и состояние его одно, перенаправить нужно лишь один раз и где угодго (если это лог, то лучше это сделать в начале программы).

C>Вызывать лог надо во всех классах, если сделать глобальную функцию, то это уже на ООП не очень смахивает.


Вот и пиши во всех своих классах лог в объект clog. Не перенаправишь — все будут писать в консоль, перенаправишь — все будут писать куда скажешь, хоть в /dev/null .
Re[4]: Расположение классов в проекте
От: Calc Россия  
Дата: 24.07.03 20:46
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Глобальные объекты потоков cout, clog, cerr, cin существуют в одном экзампляре (они — singleton'ы). Т.е. в каком бы модуле своей проги ты их не использовал, ты всегда работаешь с одним и тем же объектом. Так как объект потока один и состояние его одно, перенаправить нужно лишь один раз и где угодго (если это лог, то лучше это сделать в начале программы).


Спасибо за настойчивость, теперь я возьмусь изучать C++ подробнее.
А вообще где можно почитать о синглетонах? Что то они меня сильно задели.
Какую книгу посоветуете прочитать?
Прочёл — Программирование на Borland C++, Герберт Шилд.
Книги:
1) Бьерн Страуструп Язык программирования С++
2) Джефф Элджер (Библиотека программиста) С++
И в каком порядке посоветуете прочитать?

ME>Вот и пиши во всех своих классах лог в объект clog. Не перенаправишь — все будут писать в консоль, перенаправишь — все будут писать куда скажешь, хоть в /dev/null .

Хех подпись мою в низу хорошо видно
То есть шутку не оценил. Не дошло до меня
Re[5]: Расположение классов в проекте
От: MaximE Великобритания  
Дата: 25.07.03 07:17
Оценка:
Здравствуйте, Calc, Вы писали:

C>А вообще где можно почитать о синглетонах? Что то они меня сильно задели.


Книжка Design Patterns. Русское издание "Шаблоны проектирования"

C>Какую книгу посоветуете прочитать?

C>Прочёл — Программирование на Borland C++, Герберт Шилд.
C>Книги:
C>1) Бьерн Страуструп Язык программирования С++
C>2) Джефф Элджер (Библиотека программиста) С++
C>И в каком порядке посоветуете прочитать?

Страуструп -> (opt.) Элджер -> Майерс -> Саттер -> Дьюхёрст -> Александреску -> Коплиен

ME>>Вот и пиши во всех своих классах лог в объект clog. Не перенаправишь — все будут писать в консоль, перенаправишь — все будут писать куда скажешь, хоть в /dev/null .

C>Хех подпись мою в низу хорошо видно
C>То есть шутку не оценил. Не дошло до меня

/dev/null — все что туда пишешь уходит в никуда.
Re[6]: Расположение классов в проекте
От: Calc Россия  
Дата: 25.07.03 08:44
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Страуструп -> (opt.) Элджер -> Майерс -> Саттер -> Дьюхёрст -> Александреску -> Коплиен


Из всех авторов в книжных магазинах не нашёл только Дьюхёрст и Коплиен
Re[7]: Расположение классов в проекте
От: MaximE Великобритания  
Дата: 25.07.03 08:51
Оценка:
Здравствуйте, Calc, Вы писали:

C>Здравствуйте, MaximE, Вы писали:


ME>>Страуструп -> (opt.) Элджер -> Майерс -> Саттер -> Дьюхёрст -> Александреску -> Коплиен


C>Из всех авторов в книжных магазинах не нашёл только Дьюхёрст и Коплиен


Пока ты прочитаешь то, что нашел, найдутся и другие
Re[7]: Расположение классов в проекте
От: Вадим Никулин Россия Здесь
Дата: 25.07.03 09:06
Оценка:
Здравствуйте, Calc, Вы писали:

C>Здравствуйте, MaximE, Вы писали:


ME>>Страуструп -> (opt.) Элджер -> Майерс -> Саттер -> Дьюхёрст -> Александреску -> Коплиен


C>Из всех авторов в книжных магазинах не нашёл только Дьюхёрст и Коплиен


Плохо искал, смотри здесь: здесь и
здесь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.