Доброго времени суток.
Имеются разные классы cls_a, cls_b,cld_d
Возможно ли сделать массив из трёх ссылок, так чтобы компилятор понимал какой номер массива соответствует какому классу?
Здравствуйте, Harvat, Вы писали:
H>Доброго времени суток. H>Имеются разные классы cls_a, cls_b,cld_d H>Возможно ли сделать массив из трёх ссылок, так чтобы компилятор понимал какой номер массива соответствует какому классу?
Массив из ссылок или указателей?
Напишите, что вы хотите от этого массива. Как вы его хотите использовать?
Здравствуйте, Harvat, Вы писали:
H>Имеются разные классы cls_a, cls_b,cld_d H>Возможно ли сделать массив из трёх ссылок, так чтобы компилятор понимал какой номер массива соответствует какому классу?
а почему обычный std::tuple<cls_a&, cls_b&, cld_d&> не подходит?
Здравствуйте, Harvat, Вы писали:
H>Доброго времени суток. H>Имеются разные классы cls_a, cls_b,cld_d H>Возможно ли сделать массив из трёх ссылок, так чтобы компилятор понимал какой номер массива соответствует какому классу?
А почему просто структура не подходит?
struct POINTERS {
cls_a* ptrA;
cls_b* ptrB;
cld_d* ptrD;
};
POINTERS my_ptrs;
//…ну и тут какая-то инициализация указателей - хоть ручками, хоть в конструкторе POINTERS
Здравствуйте, Harvat, Вы писали:
H>Доброго времени суток. H>Имеются разные классы cls_a, cls_b,cld_d H>Возможно ли сделать массив из трёх ссылок, так чтобы компилятор понимал какой номер массива соответствует какому классу?
Можно все три класса отнаследовать от одного «общего» класса без методов, и создать массив элементов этого общего класса. А сами элементы массива могут быть объектами этих дочерних классов. Затем каждый элемент проверять с помощью typeid на принадлежность к конкретному типу, или использовать dynamic_cast
Здравствуйте, Harvat, Вы писали:
H>Имеются разные классы cls_a, cls_b,cld_d H>Возможно ли сделать массив из трёх ссылок, так чтобы компилятор понимал какой номер массива соответствует какому классу?
Не бывает, массив -- это набор однородных элементов.
Если откажешься от массива, у тебя сразу появится куча возможностей:
Здравствуйте, Carc, Вы писали:
C>А почему просто структура не подходит? C>
C>struct POINTERS {
C> cls_a* ptrA;
C> cls_b* ptrB;
C> cld_d* ptrD;
C>};
C>POINTERS my_ptrs;
C>//…ну и тут какая-то инициализация указателей - хоть ручками, хоть в конструкторе POINTERS
C>
Кстати говоря, структура позволит и оператор [] определить. Уж если так уж чешется, зудит и без псевдо-массива просто невмоготу.
Ну как-то вот так вот…
struct POINTERS {
cls_a* ptrA;
cls_b* ptrB;
cld_d* ptrD;
void* operator[](const size_t index);
{
switch(index) {
case 0:
return ptrA;
break;
case 1:
return ptrB;
break;
case 2:
return ptrD;
break;
default:
throw("Да вы ахирели?");
break;
}
}
};
Только нафига такая муть?
И потом тогда уж, если известны какие там указатели на этапе разработки, то для доступа по индексу использовать не число (size_t), а перечисление (enum). Не позволит хотя бы в дизайн-тайме пропихнуть в этот оператор недопустимый индекс.
Здравствуйте, Михaил, Вы писали:
М>Можно все три класса отнаследовать от одного «общего» класса без методов, и создать массив элементов этого общего класса. А сами элементы массива могут быть объектами этих дочерних классов. Затем каждый элемент проверять с помощью typeid на принадлежность к конкретному типу, или использовать dynamic_cast
UB
Здравствуйте, MasterZiv, Вы писали:
MZ>Здравствуйте, Harvat, Вы писали:
H>>Имеются разные классы cls_a, cls_b,cld_d H>>Возможно ли сделать массив из трёх ссылок, так чтобы компилятор понимал какой номер массива соответствует какому классу?
MZ>Не бывает, массив -- это набор однородных элементов.
Почему же — бывает. Просто тогда в массив надо складывать не сами классы, а их описатели. Ой, погодите, мы только что одним махом изобрели два велосипеда!