WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Перегрузка оператора -> %)

СПРОСИТЬ  ++%)">ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Перегрузка оператора -> %)
server_mouse опубликован 09-11-2001 17:18 MSK   Click Here to See the Profile for server_mouse   Click Here to Email server_mouse  
Есть проект. Повсюду в нём я использую указатель на некоторый класс. В релизной версии прога валится. Подозреваю что из-за того что где-то этот указатель NULL.

Хочу перегрузить для этого класса -> что бы при каждом вызове можно было проверить валидность указателя и отловить этот момент. Вопрос КАК?
Делаю примерно так:

class My
{
My* operator -> () {return this;}
void SomeFun(){ return; }
}

My* my=NULL;
my->SomeFun(); //SomeFun() вызывается, а оператор нет. ;(

В чём я не прав?
ЗЫ И что интересно, компилятор даже не ставит брэкпоинт на operator -> ()

migel опубликован 09-11-2001 18:29 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
Честно говоря все неправильно...
тебе нужно делать класс умного указателя и для доступа к твоему объекту использовать его т.е
вместо
My* my=NULL;
my->SomeFun()
нужно писать
MyPtr my;
my->SomeFun();

где MyPtr можно объявить шаблоном:
typedef SmartPtr<My> MyPtr;

template <class Type>
class SmartPtr
{
protected:
Type* m_ptr;
public:
SmartPtr(Type* ptrObj = NULL):
m_ptr(ptrObj)
{;}
// master pointer semantics
// Но можно и не удалять
~SmartPtr()
{
delete m_ptr;
}
operator Type*()
{
if (m_ptr == NULL)
ASSERT(FALSE);
return m_ptr;
}

Type* operator->()
{
if (m_ptr == NULL)
ASSERT(FALSE);
return m_ptr;
}
};
Вот для клиентов использующих твои классы возвращай объект MyPtr а не My*

server_mouse опубликован 11-11-2001 16:41 MSK     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
Про такое я уже читал... А так как я хотел не получится???
migel опубликован 11-11-2001 20:24 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
Нет, не получиться так как указатель на что либо сам по себе является базовым типом то ничего между ним и указываемым объектом не втиснеш - Поэтому придеться многое переписать - по крайней мере сервер (предоставляющий указатели на оюъекты).

СПРОСИТЬ  ++%)">ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.