Экземляр класса на шаблоне CMap как поле другого класса
От: Melamed Россия  
Дата: 30.07.16 09:40
Оценка:
Пишу наследник класса СТreeItem для расширения стандартного класса, управляющего стандартным органом управления TreeView на диалоговой понели.

Мне желательно в моем проектируемом классе иметь поле какого-либо из двух типов: либо

typedef CMap<HTREEITEM,HTREEITEM,int,int> THScrollMap


либо

typedef std::map<HTREEITEM,int> THScrollMap


Но когда объявляю поле типа THScrolMap, объявленным одним из вышеупомянутом способом программа падает в отладочном режиме. В режиме Release программа не падает, но и некий код работает не правильно. Но в этом режиме нельзя пошагово выполнить этот участок кода.

Никто не подскажет что я делаю не так.

Среда разработки MFC C++ MSVS 6 — требование к совместимости к системе, куда моя программа встраивается.
Re: Экземляр класса на шаблоне CMap как поле другого класса
От: AlexGin Беларусь  
Дата: 30.07.16 13:27
Оценка: 1 (1)
Здравствуйте, Melamed, Вы писали:

M>Пишу наследник класса СТreeItem для расширения стандартного класса, управляющего стандартным органом управления TreeView на диалоговой понели.


M>Мне желательно в моем проектируемом классе иметь поле какого-либо из двух типов: либо


M>
M>typedef CMap<HTREEITEM,HTREEITEM,int,int> THScrollMap
M>


M>либо


M>
M>typedef std::map<HTREEITEM,int> THScrollMap
M>


Я бы отдал предпочтение второму варианту: std::map<>

M>Но когда объявляю поле типа THScrolMap, объявленным одним из вышеупомянутом способом программа падает в отладочном режиме. В режиме Release программа не падает, но и некий код работает не правильно. Но в этом режиме нельзя пошагово выполнить этот участок кода.

Обычно — в таких местах делаю логирование (сохраняю всё в лог-файл), затем анализурую что где и как отрабатывало.
Логирование ставлю часто — так, как будто это те же breakpoint-ы.
Это логирование — только на момент поиска источника проблемы!

M>Никто не подскажет что я делаю не так.

Здесь нет полной информации, поэтому что-либо сказать трудно...

M>Среда разработки MFC C++ MSVS 6 — требование к совместимости к системе, куда моя программа встраивается.

Хорошо, я не говорю про то, куда встраивается, но возможно же (для эксперимента) — запустить этот код на более поздней MSVS.
Там будет повторение ситуации или нет?
Отредактировано 30.07.2016 13:30 AlexGin . Предыдущая версия .
Re[2]: Экземляр класса на шаблоне CMap как поле другого класса
От: Melamed Россия  
Дата: 30.07.16 15:54
Оценка:
Здравствуйте, AlexGin, Вы писали:

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


M>>Пишу наследник класса СТreeItem для расширения стандартного класса, управляющего стандартным органом управления TreeView на диалоговой понели.


M>>Мне желательно в моем проектируемом классе иметь поле какого-либо из двух типов: либо


M>>
M>>typedef CMap<HTREEITEM,HTREEITEM,int,int> THScrollMap
M>>


M>>либо


M>>
M>>typedef std::map<HTREEITEM,int> THScrollMap
M>>


AG>Я бы отдал предпочтение второму варианту: std::map<>


Я тоже первоначально остановился на втором варианте. Но когда он не прокатил, по описанной ниже проблеме, то решил использовать первый вариант как альтернативный, тем более, его рекомендуется использовать с MFC

M>>Но когда объявляю поле типа THScrolMap, объявленным одним из вышеупомянутом способом программа падает в отладочном режиме. В режиме Release программа не падает, но и некий код работает не правильно. Но в этом режиме нельзя пошагово выполнить этот участок кода.

AG>Обычно — в таких местах делаю логирование (сохраняю всё в лог-файл), затем анализурую что где и как отрабатывало.
AG>Логирование ставлю часто — так, как будто это те же breakpoint-ы.
AG>Это логирование — только на момент поиска источника проблемы!

M>>Никто не подскажет что я делаю не так.

AG>Здесь нет полной информации, поэтому что-либо сказать трудно...

Падение в отладочном режиме происходит в коде, сгенерированном средой
void CReceiverPage::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CReceiverPage)
    DDX_Control(pDX, IDC_FIELDLIST, m_TreeFields);
    DDX_Control(pDX, IDC_STDESCRIPTION, m_Desc);
    //}}AFX_DATA_MAP
}


Как я понимаю, здесь происходит присвоение к полям, управляющим контролами диалоговым окнам, к соответствующим контрол элементам шаблона диалогового окна.

Мне желательно запустить мой код именно в отладочном режиме.

M>>Среда разработки MFC C++ MSVS 6 — требование к совместимости к системе, куда моя программа встраивается.

AG>Хорошо, я не говорю про то, куда встраивается, но возможно же (для эксперимента) — запустить этот код на более поздней MSVS.
AG>Там будет повторение ситуации или нет?

Хорошо попробую запустить проблемный код в 2015 студии. Но даже, если он и пойдет без проблем, это не снимет проблемы реализации в VS 6 из-за проблем обратной совместимости сред программирования Microsoft'а
Re[3]: Экземляр класса на шаблоне CMap как поле другого класса
От: AlexGin Беларусь  
Дата: 31.07.16 09:37
Оценка:
Здравствуйте, Melamed, Вы писали:

M>Падение в отладочном режиме происходит в коде, сгенерированном средой

M>
M>void CReceiverPage::DoDataExchange(CDataExchange* pDX)
M>{
M>    CDialog::DoDataExchange(pDX);
M>    //{{AFX_DATA_MAP(CReceiverPage)
M>    DDX_Control(pDX, IDC_FIELDLIST, m_TreeFields);
M>    DDX_Control(pDX, IDC_STDESCRIPTION, m_Desc);
M>    //}}AFX_DATA_MAP
M>}
M>


Вы виртуальный метод:
virtual BOOL OnInitDialog();
переопределили?
в нем дали вызов:
CDialog::OnInitDialog();
как указано здесь:
https://msdn.microsoft.com/en-us/library/fwz35s59.aspx
Re[4]: Экземляр класса на шаблоне CMap как поле другого класса
От: Melamed Россия  
Дата: 31.07.16 19:10
Оценка:
Здравствуйте, AlexGin, Вы писали:

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


M>>Падение в отладочном режиме происходит в коде, сгенерированном средой

M>>
M>>void CReceiverPage::DoDataExchange(CDataExchange* pDX)
M>>{
M>>    CDialog::DoDataExchange(pDX);
M>>    //{{AFX_DATA_MAP(CReceiverPage)
M>>    DDX_Control(pDX, IDC_FIELDLIST, m_TreeFields);
M>>    DDX_Control(pDX, IDC_STDESCRIPTION, m_Desc);
M>>    //}}AFX_DATA_MAP
M>>}
M>>


AG>Вы виртуальный метод:

AG>virtual BOOL OnInitDialog();
AG>переопределили?
AG>в нем дали вызов:
AG>CDialog::OnInitDialog();
AG>как указано здесь:
AG>https://msdn.microsoft.com/en-us/library/fwz35s59.aspx

Да мне пришлось переопределить метод OnInitDialog() Вызов СDialog::OnInitDialog() сделал в начале соответствующего метода моего класса диалоговой панели.

Спасибо проблема решена. Если честно, я не понял, в чем было дело. Я закомментировал все сообщения в карте сообщений моего класса, потом их раскомментировал. Сначала компелятор заругался. Но я нашел, ошибку, что случайно удалил закрывающую фигурную скобку у деструктора. Ее поставил, и все заработало. Прямо какие-то чудеса
Re[5]: Экземляр класса на шаблоне CMap как поле другого клас
От: AlexGin Беларусь  
Дата: 01.08.16 10:00
Оценка:
Здравствуйте, Melamed, Вы писали:

M>Да мне пришлось переопределить метод OnInitDialog() Вызов СDialog::OnInitDialog() сделал в начале соответствующего метода моего класса диалоговой панели.

Это важный момент!

M>Спасибо проблема решена. Если честно, я не понял, в чем было дело. Я закомментировал все сообщения в карте сообщений моего класса, потом их раскомментировал.

Обычно — причина не в этом.

M>Сначала компелятор заругался. Но я нашел, ошибку, что случайно удалил закрывающую фигурную скобку у деструктора. Ее поставил, и все заработало. Прямо какие-то чудеса

А как компилятор — не ругался, когда у деструктора было невалидное тело?
Обычно такое — не позволит запустить приложение.

Ладненько — если всё OK, то и отлично!
Отредактировано 01.08.2016 10:26 AlexGin . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.