1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
typedef enum
{
VTK_DOUBLE= 1,
VTK_FLOAT,
VTK_INT
} tType;
class Data
{
public:
virtual ~Data()
{
}
virtual Data &operator(int idx) = 0;
virtual void print(ostream &o) = 0;
};
template<typename T>
class TypedData : public Data
{
T *base;
int i;
public:
TypedData(void *b)
: base((T *)b), i(0)
{
}
Data &operator()(int idx)
{
i= idx;
return *this;
}
void print(ostream &o)
{
o << base[i];
}
};
ostream &operator<<(ostream &o, const Data &d)
{
d.print(o);
return o;
}
class MaClasseA
{
MaClasseA(void );
Data &GetData();
Data &GetData(int i);
void *ptr;
tType type;
}
void MaClasseA::MaClasseA(void)
{
// ImageData est une instance de la classe vtkImageData de la librairie VTK et cette méthode renvoie un pointeur de type void * qui pointe vers un grand tableau 1D.
// Le souci est que je ne peux pas savoir à l'avance de quel type seront les données, cela dépend des images.
// Les données sont chargées ailleurs et j'ai simplifié le code pour compréhension, en tout cas j'ai accès à l'instance ImageData depuis le constructeur de cette classe.
ptr=ImageData->GetDataPointer();
// renvoi VTK_DOUBLE ou VTK_FLOAT ou autres
type=ImageData->GetScalarType();
}
Data &MaClasseA::GetData()
{
switch (type)
{
case VTK_DOUBLE :
return *new TypedData<double>(ptr);
break;
case VTK_FLOAT :
return *new TypedData<float>(ptr);
break;
default :
break;
}
}
Data &MaClasseA::GetData(int i)
{
return GetData()(i);
}
class MaClasseB : public MaClasseA
{
MaClasseB();
void MaMethodeAuPif(void);
}
void MaClasseB::MaClasseB(void){;}
void MaClasseB::MaMethodeAuPif(void)
{
cout<<"Valeur du voxel 150 "<<GetData(50)<<endl;
cout<<"Valeur du voxel 160 "<<GetData(60)<<endl;
// ou alors:
Data &d= GetData();
cout<<"Valeur du voxel 150 "<< d(50) <<endl;
cout<<"Valeur du voxel 160 "<< d(60) <<endl;
} |
Partager