Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> smart pointer-ы, работает даже тогда когда не должно..... 
:(
    Опции темы
Master01
Дата 21.9.2008, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 22.8.2007

Репутация: 2
Всего: 2



всем, привет

вот решил заняться smart pointer-ами. Нашёл замечательную книжку (хочется так думать)
Джеффа Элджера и углубился в эту увлекательную областьsmile

написал вот что

Код

class CInteger 
{
private:
    int value;

public:
    __stdcall CInteger():value(0) {}
    __stdcall CInteger(int value):value(value) {}
    virtual __stdcall ~CInteger() {};

    operator int() {return value;}
    void __stdcall msgbox() { MessageBox(NULL,"CInteger.msgbox","CInteger.msgbox",MB_OK); }
};

и
Код

class CPInteger
{
private:
    CInteger *pCInteger;
public:
    __stdcall CPInteger() { pCInteger = NULL;};
    __stdcall CPInteger(CInteger *pCInteger):pCInteger(pCInteger) {};
    virtual __stdcall ~CPInteger() {};

    operator CInteger*()   { return pCInteger; }
    CInteger* operator->() { return pCInteger; }
};


CInteger - просто некоторый класс.
CPInteger - умный указатель для него.

в Main пишу следуещее:
    CPInteger psp;
    psp->msgbox();

в результате чего на экране появляется соответствующий messadgebox, т.е. всё работает нормально.

Далее изменяю CPInteger(см. 11 строку)
Код

class CPInteger
{
private:
    CInteger *pCInteger;
public:
    __stdcall CPInteger() { pCInteger = NULL;};
    __stdcall CPInteger(CInteger *pCInteger):pCInteger(pCInteger) {};
    virtual __stdcall ~CPInteger() {};

    operator CInteger*()   { return pCInteger; }
    CInteger* operator->() { return NULL; }
};

т.е. теперь перегруженный оператор -> всегда возвращает NULL, запускаю на выполнение... ВСЁ РАБОТАЕТ!!!!!
ради смеха пробовал return reinterpret_cast<CInteger>(87878787)  и что вы думаете? во время отладки стрелочка дебаггера 
благополучно перескакивает на строчку "void __stdcall msgbox() { MessageBox(NULL,"CInteger.msgbox","CInteger.msgbox",MB_OK); }"
, в в окошке watches значение указателя this отображается как 53CEC83!!! т.е. там есть объект...

я конечно понимаю что это smart поинтеры.. но всё жsmile

Сильно подозреваю компилятор.
использую Visual studio 2003, я в принципе на неё только пересел, может что-то не так настроил.....

Добавлено через 2 минуты и 54 секунды
прошу прощения! - случайно дважды создал тему)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0525 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.