1 Востаннє редагувалося oleg734437 (03.04.2018 15:38:11)

Тема: Масив вказівників на базовий шаблонний клас

"У головній функції створити масив M=10 вказівників на базовий клас А, які ініціалізуються адресою об’єкта одного із похідних класів. "
По факту потрібно цей довгий код ініціалізації вказівників(див. внизу) запхати в цикл і зробити змінні a1, a2 .... елементами масиву. Проблема в тому що я не знаю як створити масив взазівників які вказують на різний тип даних.
Типу:

A<??>* mas[10];

Компілятор gcc 7.3.0
Ось код:

#include <iostream>
#include <typeinfo>
#include <ctime>

using namespace std;

template <class T>
class A {
private:
    T X;
public:
    virtual T Get() {
        return X;
    } 
};

class B : public A<int> {
private:
    int I;
public:
    B () {
        I = 0;
    }
    int Get() {
        return I;
    } 
};

class C : public A<float> {
private:
    float F;
public:
    C () {
        F = 0.1;
    }
    float Get() {
        return F;
    }
};

class D : public A<char> {
private:
    char H;
public:
    D () {
        H = '0';
    }
    char Get() {
        return H;
    }
};

int main() {
    const int M = 10;
    srand(time(NULL));

    B* b1 = new B;
    A<int>* a1;
    a1 = b1;

    D* d2 = new D;
    A<char>* a2;
    a2 = d2;

    C* c3 = new C;
    A<float>* a3;
    a3 = c3; 

    D* d4 = new D;
    A<char>* a4;
    a4 = d4;

    B* b5 = new B;
    A<int>* a5;
    a5 = b5;

    C* c6 = new C;
    A<float>* a6;
    a6 = c6; 

    C* c7 = new C;
    A<float>* a7;
    a7 = c7; 

    D* d8 = new D;
    A<char>* a8;
    a8 = d8;

    B* b9 = new B;
    A<int>* a9;
    a9 = b9;

    C* c10 = new C;
    A<float>* a10;
    a10 = c10; 
}

P. S. Повне завдання якщо треба:
На вершині ієрархії знаходиться базовий шаблонний клас
template <class T> class А;
який у захищеній частині містить оголошення значення X типу Т, а у відкритій
частині – віртуальний метод Get() отримання цього значення.
Визначити N > 2 похідних класів з власними даними та методами, які утворюють поліморфічний
кластер на основі класу А.

У головній функції створити масив M=10 вказівників
на базовий клас А, які ініціалізуються адресою об’єкта одного із похідних
класів.

Тип створюваного об’єкта вибирається випадково з ієрархії класів (на
основі вбудованого генератора цілих випадкових величин з діапазону [0, N1]).
На основі механізму ідентифікації типів (клас type_info) визначити
назву класу, на який вказує кожен із елементів масиву вказівників.
Використати масив вказівників для виклику віртуальних методів

2

Re: Масив вказівників на базовий шаблонний клас

Вам не вдасться створити вказівник на шаблонний клас без інстанціації цього класу, а отже, треба або робити нащадків шаблонними, або додавати над шаблонним класом ще вищий нешаблонний і робити dynamic_cast.
Ну, або ж робити масив void * і перетворювати вказівники static_cast, що зовсім погано.
Проблема в тому, що A<int> та A<float> - це геть різні типи, настільки ж різні, наскільки різні int та float. Під час виконання не вийде їх перетворити без небезпечних операцій (зате з небезпечними - скільки завгодно: https://ideone.com/J5HVUc )

Подякували: oleg734437, leofun01, Yola4

3 Востаннє редагувалося Alchimic (21.04.2018 19:34:43)

Re: Масив вказівників на базовий шаблонний клас

масив класу а і туди пихати інші обєкти класів нащадків. поліморфізм.