Smart pointer, abstract base class
От: Аноним  
Дата: 07.12.05 20:50
Оценка:
Дано:


class CAbstractBase
{
  void foo() = 0;
};

class CConcreteClass : public CAbstractBase
{
  void foo(){};
};

class CConcreteClass2 : public CAbstractBase
{
  void foo(){};
};

//
// smart_ptr - шаблонный класс, некий "умный указатель".
//
CAtlMap< int, smart_ptr< CAbstractBase > > mapList;


CConcreteClass * pConcrete = new CConcreteClass;
smart_ptr< CAbstractBase > spMyPtr( pConcrete );

//
// не помню как называется ф-ция добавления эл-та в CAtlMap, 
// но смысл понятен - добавили переменную в ассоциативный массив
//
mapList.Add( 1, spMyPtr ); 

CConcreteClass2 * pConcrete2 = new CConcreteClass2;
smart_ptr< CAbstractBase > spMyPtr2( pConcrete2 );

mapList.Add( 2, spMyPtr );



Что хотелось бы иметь:


smart_ptr< CConcreteClass > sp; 
mapList.Lookup( 1, sp );

smart_ptr< CConcreteClass2 > sp2;
mapList.Looup( 2, sp2 );


Каким образом это реализовать?
Re: Smart pointer, abstract base class
От: Angler Россия  
Дата: 08.12.05 09:07
Оценка:
Здравствуйте, Аноним, Вы писали:



А>Каким образом это реализовать?


1. Добавить виртуальный деструктор в CAbstractBase
2. Сделать foo виртуальным
3. В Lookup необходимо запросить CAbstractBase, например при помощи dynamic_cast запросить у него указатель на указываемый CConcreteClass или CConcreteClass2, увеличить счетчик ссылок, отдать необходимый смартпоинтер.
4. Реализовать смартпоинтер будет намного проще, если встроить механизм подсчета ссылок в CAbstractBase(AddRef, Release). За одно можно туда же запихать QueryInterface, если нет возможности RTTI
Re: Smart pointer, abstract base class
От: gbt Россия  
Дата: 08.12.05 09:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Что хотелось бы иметь:

А>smart_ptr< CConcreteClass > sp; 
А>mapList.Lookup( 1, sp );

А>smart_ptr< CConcreteClass2 > sp2;
А>mapList.Looup( 2, sp2 );

А>Каким образом это реализовать?

А какова должна быть реакция этого кода на то, что в мапе под ключем 1, например, хранится не CConcreteClass, а CConcreteClass2 ?
Re[2]: Smart pointer, abstract base class
От: Аноним  
Дата: 08.12.05 10:33
Оценка:
Здравствуйте, gbt, Вы писали:

gbt>Здравствуйте, Аноним, Вы писали:


А>>Что хотелось бы иметь:

gbt>
А>>smart_ptr< CConcreteClass > sp; 
А>>mapList.Lookup( 1, sp );

А>>smart_ptr< CConcreteClass2 > sp2;
А>>mapList.Looup( 2, sp2 );
gbt>

А>>Каким образом это реализовать?

gbt>А какова должна быть реакция этого кода на то, что в мапе под ключем 1, например, хранится не CConcreteClass, а CConcreteClass2 ?


Пусть кидает эксепшн. Считаем что ключ и класс сопоставляются однозначно, т.е. ключ является идентификатором типа.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.