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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Опять трабла, опять шаблоны... Взгляните, может я где напутал... 
:(
    Опции темы
Chaos A.D.
  Дата 7.6.2005, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 16.1.2005
Где: 09 RUS

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



Ещё одна проблема: излагаю пластами - код/комментарии...

Код

template < class T >
struct DeleteAndNil
{
    static void Delete ( T &obj )
    { delete obj; obj = NULL; }
};

template < class T >
struct NoDelete
{
    static void Delete ( T obj )
    { return; }
};


Это, кто не знает, два класса, определяющие способ уничтожения объекта. Наследуются реальными классами.

Код

template <template <class> class DeletePolicy >
class FrameManager : public DeletePolicy<TFrame*>
{
    public :
        virtual TFrame* Make( Classes::TComponent* Owner,
            TWinControl *Parent ) = 0;

        virtual void Remove ( void ) = 0;

        static FrameManager<DeletePolicy>* MakeFrameManager(FindFrameVariant);
};


Этот шаблон класса инстанцируется с параметром - одним из двух предыдущих классов. Он абстрактный, как видите.

Код

template < template <class> class DeletePolicy >
class FindFrameManager : public FrameManager<DeletePolicy>
{
    private :
        static TFindFrame *frame;

    public :
        virtual TFrame* Make( Classes::TComponent* Owner, TWinControl *Parent )
        {
            if ( !frame )
                frame = new TFindFrame(Owner);
            frame->Parent = Parent;
            frame->Align = alClient;
            frame->Show();
            frame->ImgClose->OnClick = WantToClose;
        };

        virtual void Remove( void )
            { frame->Hide(); frame->Parent = NULL; Delete(frame); } /* 1 */

            EventHandler WantToClose;
};

template <template <class> class DeletePolicy >
TFindFrame* FindFrameManager<DeletePolicy>::frame = NULL;


В предыдущем коде я пометил место, где прога работает не совсем ясным для меня образом. Видите, Delete(frame); Далее пример:
У меня предыдущие шаблоны в программе инстанцируются с параметром <DeleteAndNil>; Затем в одном месте у меня происходит вызов Remove для класса FindFrameManager;
Далее идем вслед за дебуггером - вызывается delete obj; из DeleteAndNil, А вот obj = NULL не срабатывает. Локально он делает obj равным NULL, но вот frame из FindFrameManager по прежнему указывает на удаленный объект. Взгляните, пожалуйста, правильно ли все в коде? Правильно ли я передаю ссылку на указатель, или чего напутал? Кстати, написал упрощенный вариант вне контекста приложения, тоже не работает. Зато пашет, если frame указывает на тот параметр, которым инстанцирован шаблон DeleteAndNil; Как там в С++ с правилами о ссылках на указатели на полиморфные объекты?
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest
PM MAIL   Вверх
Chaos A.D.
Дата 7.6.2005, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 16.1.2005
Где: 09 RUS

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



Я дико извиняюсь, но буквально через 15 минут сам нашел решение проблемы. Вы можете подумать, что я вот так специально задаю разные вопросы, обильно снабдив их каким-нибудь кодом, выдранным из книг, чтобы показать свою, хм, "крутость". Но это не так. Вообще, поразительно, но факт - один из возможных, а по моему и самый лучший способ решения любой проблемы - это изложить ее коллеге/приятелю. Так как мне излагать проблему не кому, даже кошки нет (:, я вот сюда, в форум.
Оказывается, действительно, как я в конце поста писал - у С++ свои соображения по поводу ссылок на указатели на наследуемые классы. До этого я додумался, пока писал первый пост, а потом осталось только проверить. После создания похожей ситуации в миниатюре, я понял, что компилер создает временную переменную для указателя. А лечится это явным приведением типов. Ура. smile
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest
PM MAIL   Вверх
ManiaK
Дата 7.6.2005, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

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



Цитата(Chaos @ 7.6.2005, 10:27)
Я дико извиняюсь, но буквально через 15 минут сам нашел решение проблемы.

Нормально, у самого было и не раз smile
PM MAIL WWW   Вверх
Fantasist
Дата 10.6.2005, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Цитата(Chaos @ 7.6.2005, 07:27)
Оказывается, действительно, как я в конце поста писал - у С++ свои соображения по поводу ссылок на указатели на наследуемые классы.


По-моему это у билдера свои соображения. Указатель на класс (пусть даже и полиморфный) ничем не отличается от указателя на что-либо другое (за исключением указателя на член класса/структуры), и код должен работать одинаково во всех случаях.

Единственно что может произойти, что тип параметра DeleteAndNil не соотвествует типу frame, и существует преобразование второго к первому путем создания темпорального объекта. Хотя не представляю, как это можно сделать с указателями, но это может быть тоже "личным мнением" Билдера.

Это сообщение отредактировал(а) Fantasist - 10.6.2005, 20:04


--------------------
Волны гасят ветер...
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.0447 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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