CWnd::GetSafeHwnd
От: rus blood Россия  
Дата: 20.07.04 07:48
Оценка:
Прикольная реализация...

_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const
    { return this == NULL ? NULL : m_hWnd; }



23.07.05 02:11: Перенесено модератором из 'MFC' — SchweinDeBurg
24.07.05 07:18: Перенесено модератором из 'C/C++. Прикладные вопросы' — Павел Кузнецов
Имею скафандр — готов путешествовать!
Re: CWnd::GetSafeHwnd
От: p0l  
Дата: 20.07.04 08:07
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Прикольная реализация...


RB>
RB>_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const
RB>    { return this == NULL ? NULL : m_hWnd; }
RB>


Что ж прикольного?
Re[2]: CWnd::GetSafeHwnd
От: rus blood Россия  
Дата: 20.07.04 08:28
Оценка:
Здравствуйте, p0l, Вы писали:

p0l>Что ж прикольного?


Сравнение this с NULL-ом.
Имею скафандр — готов путешествовать!
Re[3]: CWnd::GetSafeHwnd
От: Ivroy  
Дата: 20.07.04 08:56
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Сравнение this с NULL-ом.


ну и что? при this == NULL обращение к данным не происходит.
все грамотно написано.
Re[4]: CWnd::GetSafeHwnd
От: rus blood Россия  
Дата: 20.07.04 08:59
Оценка:
Здравствуйте, Ivroy, Вы писали:

I>Здравствуйте, rus blood, Вы писали:


RB>>Сравнение this с NULL-ом.


I>ну и что? при this == NULL обращение к данным не происходит.

I>все грамотно написано.

Я в этом и не сомневался...
Имею скафандр — готов путешествовать!
Re[3]: CWnd::GetSafeHwnd
От: p0l  
Дата: 20.07.04 09:19
Оценка:
Здравствуйте, rus blood, Вы писали:

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


p0l>>Что ж прикольного?


RB>Сравнение this с NULL-ом.



CWnd *pWnd = NULL;
pWnd->GetSafeWnd(); // тут не грохнется, а вернет именно NULL :)


иначе если делать проверку типа

pWnd->m_hWnd;

то грохнеться с null reference exception .
Re[4]: CWnd::GetSafeHwnd
От: rus blood Россия  
Дата: 20.07.04 09:45
Оценка:
Здравствуйте, p0l, Вы писали:

p0l>
p0l>CWnd *pWnd = NULL;
pWnd->>GetSafeWnd(); // тут не грохнется, а вернет именно NULL :)
p0l>

Вот это и прикольно. "Вызов метода" по нулевому указателю.


p0l>то грохнеться с null reference exception .

Это все понятно...
Имею скафандр — готов путешествовать!
Re[5]: CWnd::GetSafeHwnd
От: p0l  
Дата: 20.07.04 09:49
Оценка:
Здравствуйте, rus blood, Вы писали:

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


p0l>>
p0l>>CWnd *pWnd = NULL;
pWnd->>>GetSafeWnd(); // тут не грохнется, а вернет именно NULL :)
p0l>>

RB>Вот это и прикольно. "Вызов метода" по нулевому указателю.

Умом МФСию не понять
Re: CWnd::GetSafeHwnd
От: gbt Россия  
Дата: 23.07.05 02:17
Оценка:
Hello, rus, you wrote:

>
> _AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const
>         { return this == NULL ? NULL : m_hWnd; }
>


При выполнении такого кода ,eltn undefined behavior:
CWnd * pWnd = NULL;
pWnd->GetSafeWnd();


[class.mfct.nonstatic] 9.3.1 Nonstatic member functions
1 A nonstatic member function may be called for an object of its class type, or for an object of a class derived
(clause 10) from its class type, using the class member access syntax (5.2.5, 13.3.1.1). A nonstatic member
function may also be called directly using the function call syntax (5.2.2, 13.3.1.1)
— from within the body of a member function of its class or of a class derived from its class, or
— from a mem-initializer (12.6.2) for a constructor for its class or for a class derived from its class.
If a nonstatic member function of a class X is called for an object that is not of type X, or of a type derived
from X, the behavior is undefined.


--
Igor Polyakov — igorpol_gbt (at) mail (dot) ru
Posted via RSDN NNTP Server 1.9
Re[2]: CWnd::GetSafeHwnd
От: adontz Грузия http://adontz.wordpress.com/
Дата: 23.07.05 13:01
Оценка:
Здравствуйте, gbt, Вы писали:

gbt>При выполнении такого кода будет undefined behavior:


Это в теории. На практике для MSVC подобный трюк замечательно работает. При всех его недостатках (несоответствие стандарту, плохая переносимость и проч.) использование кода становится удобнее.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: CWnd::GetSafeHwnd
От: gbt Россия  
Дата: 23.07.05 17:02
Оценка:
Hello, adontz, you wrote:

gbt>>При выполнении такого кода будет undefined behavior:

> Это в теории. На практике для MSVC подобный трюк замечательно работает. При
> всех его недостатках (несоответствие стандарту, плохая переносимость и проч.)
> использование кода становится удобнее.
Хм, вы предлагаете в каждом нестатическом методе делать проверку на this == NULL
перед обращением к любым членам и говорите, что это удобнее...

А если вы предлагаете использовать подобную технику только с классми MFC, в
которых эти проверки делаются, то вскоре возникнет проблема: вы случайно
попытаетесь вызвать метод не-MFC класса для NULL — указателя... ИМХО, лучше
использовать единые правила и стиль программирования во всем проекте. Как только
возникает разделение, начинаются проблемы, связанные с расплывчатостью границ
данного разделения...

ИМХО это аналогично передачи в качестве ссылки разименованного нулевого
указателя — теряется все преимущество ссылки...

--
Igor Polyakov — igorpol_gbt (at) mail (dot) ru
Posted via RSDN NNTP Server 1.9
Re[4]: CWnd::GetSafeHwnd
От: adontz Грузия http://adontz.wordpress.com/
Дата: 23.07.05 17:24
Оценка:
Здравствуйте, gbt, Вы писали:

gbt>Хм, вы предлагаете в каждом нестатическом методе делать проверку на this == NULL

gbt>перед обращением к любым членам и говорите, что это удобнее...

Нет, нет ни в коем случае.
Я говорю о другом. Пусть некоторый класс имеет смысл указателя. Я говорю не об умных указателях, а например об элементах списка или узлах дерева, которые по сути своей указатели.
Пример — деструктор элемента двоичного дерева
// было
  ~CBinTreeElement()
  {
    if (!this->IsNull(this->lpCLeft)) delete this->lpCLeft;
    if (!this->IsNull(this->lpCRight)) delete this->lpCRight;
  }
// хочу
  ~CBinTreeElement()
  {
    if (!this->lpCLeft->IsNull()) delete this->lpCLeft;
    if (!this->lpCRight->IsNull()) delete this->lpCRight;
  }

Код становится короче, понятнее и нередко эффективнее
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[5]: CWnd::GetSafeHwnd
От: Centaur Россия  
Дата: 24.07.05 07:03
Оценка:
Здравствуйте, adontz, Вы писали:

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


gbt>>Хм, вы предлагаете в каждом нестатическом методе делать проверку на this == NULL

gbt>>перед обращением к любым членам и говорите, что это удобнее...

A>Нет, нет ни в коем случае.

A>Я говорю о другом. Пусть некоторый класс имеет смысл указателя. Я говорю не об умных указателях, а например об элементах списка или узлах дерева, которые по сути своей указатели.
A>Пример — деструктор элемента двоичного дерева
A>
A>// было
A>  ~CBinTreeElement()
A>  {
A>    if (!this->IsNull(this->lpCLeft)) delete this->lpCLeft;
A>    if (!this->IsNull(this->lpCRight)) delete this->lpCRight;
A>  }
A>// хочу
A>  ~CBinTreeElement()
A>  {
A>    if (!this->lpCLeft->IsNull()) delete this->lpCLeft;
A>    if (!this->lpCRight->IsNull()) delete this->lpCRight;
A>  }
A>

A>Код становится короче, понятнее и нередко эффективнее
В данном примере, вероятно, короче, понятнее и эффективнее будет
~CBinTreeElement()
{
  delete lpCLeft;
  delete lpCRight;
}

если только понятие IsNull не определено как { return this == reinterpret_cast<CBinTreeElement*>(0xDEADBEEF); }, а под нулём понимается настоящий null pointer value [4.10.1].
Re[6]: CWnd::GetSafeHwnd
От: adontz Грузия http://adontz.wordpress.com/
Дата: 24.07.05 09:47
Оценка:
Здравствуйте, Centaur, Вы писали:

C>если только понятие IsNull не определено как { return this == reinterpret_cast<CBinTreeElement*>(0xDEADBEEF); }, а под нулём понимается настоящий null pointer value [4.10.1].


Нет, в том-то всё и дело, что null это был именно, не null pointer value, а указатель на специально созданный элемент.
A journey of a thousand miles must begin with a single step © Lau Tsu
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.