массив указателей разных типов
От: Harvat  
Дата: 17.01.20 12:27
Оценка:
Доброго времени суток.
Имеются разные классы cls_a, cls_b,cld_d
Возможно ли сделать массив из трёх ссылок, так чтобы компилятор понимал какой номер массива соответствует какому классу?
Re: массив указателей разных типов
От: B0FEE664  
Дата: 17.01.20 12:34
Оценка:
Здравствуйте, Harvat, Вы писали:

H>Доброго времени суток.

H>Имеются разные классы cls_a, cls_b,cld_d
H>Возможно ли сделать массив из трёх ссылок, так чтобы компилятор понимал какой номер массива соответствует какому классу?

Массив из ссылок или указателей?
Напишите, что вы хотите от этого массива. Как вы его хотите использовать?
И каждый день — без права на ошибку...
Re: массив указателей разных типов
От: sergii.p  
Дата: 17.01.20 12:45
Оценка:
Здравствуйте, Harvat, Вы писали:

H>Имеются разные классы cls_a, cls_b,cld_d

H>Возможно ли сделать массив из трёх ссылок, так чтобы компилятор понимал какой номер массива соответствует какому классу?

а почему обычный std::tuple<cls_a&, cls_b&, cld_d&> не подходит?
Re: массив указателей разных типов
От: Carc Россия https://vk.com/gosha_mazov
Дата: 17.01.20 12:51
Оценка: +2
Здравствуйте, 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
Aml Pages Home
Отредактировано 17.01.2020 12:52 Carc . Предыдущая версия .
Re: массив указателей разных типов
От: Михaил  
Дата: 17.01.20 12:59
Оценка: +2
Здравствуйте, Harvat, Вы писали:

H>Доброго времени суток.

H>Имеются разные классы cls_a, cls_b,cld_d
H>Возможно ли сделать массив из трёх ссылок, так чтобы компилятор понимал какой номер массива соответствует какому классу?

Можно все три класса отнаследовать от одного «общего» класса без методов, и создать массив элементов этого общего класса. А сами элементы массива могут быть объектами этих дочерних классов. Затем каждый элемент проверять с помощью typeid на принадлежность к конкретному типу, или использовать dynamic_cast
Re: массив указателей разных типов
От: MasterZiv СССР  
Дата: 17.01.20 14:16
Оценка:
Здравствуйте, Harvat, Вы писали:

H>Имеются разные классы cls_a, cls_b,cld_d

H>Возможно ли сделать массив из трёх ссылок, так чтобы компилятор понимал какой номер массива соответствует какому классу?

Не бывает, массив -- это набор однородных элементов.

Если откажешься от массива, у тебя сразу появится куча возможностей:

std::vector< std::variant< cls_a, cls_b, cld_d > > arr;

P.S. похоже, автору всё же не это нужно, а что-то типа
struct Arrays {
cls_a as[200];
cls_b bs[200];
cld_d cs[200];
};
Отредактировано 17.01.2020 14:18 MasterZiv . Предыдущая версия .
Re[2]: массив указателей разных типов
От: Carc Россия https://vk.com/gosha_mazov
Дата: 17.01.20 14:30
Оценка:
Здравствуйте, 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). Не позволит хотя бы в дизайн-тайме пропихнуть в этот оператор недопустимый индекс.

И тогда уже как-то вот так вот…
struct POINTERS {
    cls_a* ptrA; 
    cls_b* ptrB;
    cld_d* ptrD;

enum MY_INDEX{IND_A, IND_B, IND_D}
void* operator[](const MY_INDEX index)
{
    //… …
}
}
Aml Pages Home
Отредактировано 17.01.2020 14:31 Carc . Предыдущая версия .
Re[2]: массив указателей разных типов
От: dead0k  
Дата: 17.01.20 14:38
Оценка:
Здравствуйте, Михaил, Вы писали:

М>Можно все три класса отнаследовать от одного «общего» класса без методов, и создать массив элементов этого общего класса. А сами элементы массива могут быть объектами этих дочерних классов. Затем каждый элемент проверять с помощью typeid на принадлежность к конкретному типу, или использовать dynamic_cast

UB
Re[2]: массив указателей разных типов
От: Mr.Delphist  
Дата: 29.01.20 16:06
Оценка:
Здравствуйте, MasterZiv, Вы писали:

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


H>>Имеются разные классы cls_a, cls_b,cld_d

H>>Возможно ли сделать массив из трёх ссылок, так чтобы компилятор понимал какой номер массива соответствует какому классу?

MZ>Не бывает, массив -- это набор однородных элементов.


Почему же — бывает. Просто тогда в массив надо складывать не сами классы, а их описатели. Ой, погодите, мы только что одним махом изобрели два велосипеда!

Boost.Variant
Boost.MPL
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.