Здравствуйте, YuriS, Вы писали:
YS>Привет всем!
YS>Необходимо решить следующую проблему:
YS>Определён базовый класс (интерфейс) в котом есть мап из объектов (определяю typedef std::map< ENUM, Parameter > Parameters), как индекс должен испольсоваться определенныи набор уникальных индексов (пока пробую enum) и метод доступа к этому мапу. Проблема в том, что в классах наследниках меняется набор индексов для мапа, на что компилятор совсем не хочет согласится.
YS>Как можно решить ету задачу, может я иду по неправильному пути?
YS>Задача состоит в том, чтобы опеделить интерфеис для классов, которые имеют набор определенных параметров одинаковой структуры.
------------------
А так ли принципиально городить интерфейсы ?
Если грабли заключаются в разнородных индексах то :
Первое что приходит в голову : класс — шаблон с классом индексов в качестве параметра шаблона :
----------------------------------------
// Определяем класс - контейнер
template < class __INDEX_CLASS >
class CBaseClass
{
protected:
std::map< __INDEX_CLASS , Parameter > Parameters;
public:
...
...
Parameter GetFuckingParameterByTemplateIndex( const __INDEX_CLASS& __Index )
{
std::map< __INDEX_CLASS , Parameter >::iterator itFound =
Parameters.find( __Index );
if ( itFound == Parameters.end() )
{
throw чего-нибудь;
}
return itFound->second;
}
};
//-------------------------
// Определяем конкретный индекс ( первое - что пришло в голову - 3-х мерный индекс )
class CTripleIndex
{
protected:
long i,j,k;
public:
CTripleIndex( long _i, long _j, long _k )
:
i(_i),j(_j),k(_k)
{}
bool operator < ( const CTripleIndex& e )
{
if ( i != e.i )
return i < e.i;
if ( j != e.j )
return j < e.j;
return k < e.k;
}
CTripleIndex( const CTripleIndex& e )
: i(e.i),j(e.j),k(e.k)
{}
// На сколько я помню 'operator =' тут не нужен
}
////////////////////////////
Usage :
...........
CBaseClass<CTripleIndex> ParametersContainer;
.............
Parameter __param = ParametersContainer.GetFuckingParameterByTemplateIndex( CTripleIndex( 1, 2, 3 ) );
.........
// вот и вся любовь
P.S. Писалось на вскидку. Так что особо к коду не докапываться плиз...