Множество классов с разным набором типовых параметров
От: YuriS Германия www.yuris.de
Дата: 19.05.04 12:39
Оценка:
Привет всем!

Необходимо решить следующую проблему:

Определён базовый класс (интерфейс) в котом есть мап из объектов (определяю typedef std::map< ENUM, Parameter > Parameters), как индекс должен испольсоваться определенныи набор уникальных индексов (пока пробую enum) и метод доступа к этому мапу. Проблема в том, что в классах наследниках меняется набор индексов для мапа, на что компилятор совсем не хочет согласится.

Как можно решить ету задачу, может я иду по неправильному пути?

Задача состоит в том, чтобы опеделить интерфеис для классов, которые имеют набор определенных параметров одинаковой структуры.

24.05.04 06:16: Перенесено из 'Проектирование'
Re: Множество классов с разным набором типовых параметров
От: Andrew Swan Россия  
Дата: 19.05.04 14:48
Оценка:
Здравствуйте, 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. Писалось на вскидку. Так что особо к коду не докапываться плиз...
Re: Множество классов с разным набором типовых параметров
От: Sinclair Россия https://github.com/evilguest/
Дата: 20.05.04 07:58
Оценка:
Здравствуйте, YuriS, Вы писали:
YS>Задача состоит в том, чтобы опеделить интерфеис для классов, которые имеют набор определенных параметров одинаковой структуры.
Я правильно понимаю, что задача каждого из этих классов — вынимать значения параметров не по имени (через .Param1), а по идентификатору (.Parameters(something))? И этот something должен принимать ровно одно из предопределенных значений? А наследники должны уметь расширять этот список, но не сужать его, так? Типа для
Base b можно вызывать b.Parameters(red) и b.Parameters(green), вызов b.Parameters(yellow) приводит к ошибке компиляции, так? Но можно сделать class Derived:Base так, чтобы на Derived d вызов d.Parameters(yellow) уже был валиден, и все еще можно было бы вызывать d.Parameters(green) и d.Parameters(red)?
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Множество классов с разным набором типовых параметров
От: YuriS Германия www.yuris.de
Дата: 21.05.04 08:27
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, YuriS, Вы писали:

YS>>Задача состоит в том, чтобы опеделить интерфеис для классов, которые имеют набор определенных параметров одинаковой структуры.
S>Я правильно понимаю, что задача каждого из этих классов — вынимать значения параметров не по имени (через .Param1), а по идентификатору (.Parameters(something))? И этот something должен принимать ровно одно из предопределенных значений?
Абсолютно верно, толко наследники должны использовать этот мап с помощью в них определённых идентификаторов, а не расширять его (по идее в базом классе список идентификаторов пустой).
Нужно еще подумать о том, как внешние объекты общаются с этими через интерфейс базового класса.
Re[3]: Множество классов с разным набором типовых параметров
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.05.04 13:39
Оценка:
Здравствуйте, YuriS, Вы писали:
YS>Абсолютно верно, толко наследники должны использовать этот мап с помощью в них определённых идентификаторов, а не расширять его (по идее в базом классе список идентификаторов пустой).
YS>Нужно еще подумать о том, как внешние объекты общаются с этими через интерфейс базового класса.
Есть один довольно экхотический способ это получить Попробую на днях привести пример, если время найдется. Да, кстати, через интерфейс базового класса ничего особенного не получится, если у него список идентификаторов пуст. Туда просто ничего нельзя будет передать.
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Множество классов с разным набором типовых параметров
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.05.04 15:21
Оценка: 6 (1)
Здравствуйте, Sinclair, Вы писали:
S>Есть один довольно экхотический способ это получить Попробую на днях привести пример, если время найдется. Да, кстати, через интерфейс базового класса ничего особенного не получится, если у него список идентификаторов пуст. Туда просто ничего нельзя будет передать.
Вот пример:
// TestingCovariance.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
using namespace std;

class BaseTrait {
protected:
    BaseTrait();
public:
    void F1(){};
    void F2(){};
};

typedef void (BaseTrait::*BT)();

class Base {
public:
    virtual void GetParameter(BT Trait)
    {
        if (Trait == BaseTrait::F1)
            cout << "F1" << endl;
        if (Trait == BaseTrait::F2)
            cout << "F2" << endl;
    };
};

class DerivedTrait : public BaseTrait {
protected:
    DerivedTrait();
public:
    void F3(){};
    static DerivedTrait T4;
};
typedef void (DerivedTrait::*DT)();

class Derived: public Base {
public:
    virtual void GetParameter(BT Trait)
    {
        GetParameter((DT)Trait);
    };

    virtual void GetParameter(DT Trait)
    {
        if (Trait == DerivedTrait::F1)
            cout << "F1" << endl;
        if (Trait == DerivedTrait::F2)
            cout << "F2" << endl;
        if (Trait == DerivedTrait::F3)
            cout << "F3" << endl;
    };
};

int _tmain(int argc, _TCHAR* argv[])
{
    Base b;
    Derived d;
    b.GetParameter(BaseTrait::F1);
    b.GetParameter(DerivedTrait::F2);
//    b.GetParameter(DerivedTrait::F3); // error C2664: 'Base::GetParameter' : cannot convert parameter 1 from 'void (__thiscall DerivedTrait::* )(void)' to 'BT'
    d.GetParameter(BaseTrait::F1);
    d.GetParameter(BaseTrait::F2);
    d.GetParameter(DerivedTrait::F3);
}

BaseTrait и DerivedTrait играют роль енумов. Их константами являются F1..F3. Как видно, BaseTrait::F2 и DerivedTrait::F2 взаимозаменяемы. Зато вот в метод Base::GetParameter() нельзя передать DerivedTrait::F3. Ты этого хотел?
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Множество классов с разным набором типовых параметров
От: YuriS Германия www.yuris.de
Дата: 25.05.04 21:59
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>BaseTrait и DerivedTrait играют роль енумов. Их константами являются F1..F3. Как видно, BaseTrait::F2 и DerivedTrait::F2 взаимозаменяемы. Зато вот в метод Base::GetParameter() нельзя передать DerivedTrait::F3. Ты этого хотел?

Не совсем, в классах наследниках должен набор параметров переопределятся, а не наследоваться.
Смысл в том, чтобы например можно было в классе интерфейсе определить

typedef std::map<EnumClass, Parameter> Parameters
Parameters* getParameters()

а потом в наследниках свободно состав EnumClass менять.
... << RSDN@Home 1.1.4 beta 1 >>
Re[6]: Множество классов с разным набором типовых параметров
От: Kluev  
Дата: 26.05.04 07:24
Оценка:
Здравствуйте, YuriS, Вы писали:

YS>Здравствуйте, Sinclair, Вы писали:


S>>BaseTrait и DerivedTrait играют роль енумов. Их константами являются F1..F3. Как видно, BaseTrait::F2 и DerivedTrait::F2 взаимозаменяемы. Зато вот в метод Base::GetParameter() нельзя передать DerivedTrait::F3. Ты этого хотел?

YS>Не совсем, в классах наследниках должен набор параметров переопределятся, а не наследоваться.
YS>Смысл в том, чтобы например можно было в классе интерфейсе определить

YS>typedef std::map<EnumClass, Parameter> Parameters

YS>Parameters* getParameters()

YS>а потом в наследниках свободно состав EnumClass менять.

сделай map<int,Parametr>
Re[7]: Множество классов с разным набором типовых параметров
От: YuriS Германия www.yuris.de
Дата: 26.05.04 09:34
Оценка:
Здравствуйте, Kluev, Вы писали:

K>сделай map<int,Parametr>

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