Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
8 / 8 / 2
Регистрация: 15.12.2010
Сообщений: 41
1

Как можно объявить класс, заранее не зная его тип template.

03.10.2011, 17:46. Просмотров 1829. Ответов 12
Метки нет (Все метки)

Класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <class type> class My {
    private:
        int n;
        double sum;
        type *al;
    public:
        My()
        {
            al = NULL;
        }
        ~My()
        {
            delete [] al;
        }
}
Основной код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "My.h"
 
void main()
{
    int prec;
 
    /* тут из файла считывается значение prec */
 
/*  if(prec == 1)
    {
        My <float> Class;
    }
    else if(prec == 2)
    {
        My <double> Class;
    }               */
 
    /* потом идёт много кода с участием Class */
}
Так, увы, не работает. Это вообще как-то возможно? С typedef поколдовать или ещё что-то?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.10.2011, 17:46
Ответы с готовыми решениями:

Можно ли задать массив, не зная заранее его длину?
Доброе утро всем. Вчера начал читать &quot;главу 4 Массивы&quot;. Там предложили 2 варианта объявления...

Можно ли объявить переменную не как тип, а как свойство какого-либо объекта
Сегодня впервые сел за c# (по работе нужно) решил состряпать простенький калькулятор, в событии...

Как получить id элемента, зная только его класс?
Приветствую товарищи! Пожалуйста, помогите мне с решением одной задачи. У меня есть такой код: ...

Как можно завершить процесс зная его имя ?
как можно завершить процесс зная его имя ?

12
Эксперт С++
516 / 420 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
03.10.2011, 18:00 2
Никак невозможно. Шаблоны генерятся в момент компиляции.
0
Заблокирован
03.10.2011, 18:36 3
можно унаследовать всё это семейство классов от одного абстрактного класса MyAbstract

C++
1
2
3
4
5
6
7
8
9
        MyAbstract *class;
        if(prec == 1)
        {
                class = new My<float>;
        }
        else if(prec == 2)
        {
                class = new My<double>;
        }
1
8 / 8 / 2
Регистрация: 15.12.2010
Сообщений: 41
03.10.2011, 19:31  [ТС] 4
Спасибо, попробую.
Я так понял создать абстрактный класс :
C++
1
2
3
4
5
6
7
8
class abstractMy {
                virtual abstractMy()
                {
                }
                virtual ~abstractMy()
                {
                }
}
И тогда, приведенная вами выше, конструкция сработает?

// оу, точно. А то получится совсем не то)
0
Заблокирован
03.10.2011, 19:34 5
деструктор (чисто)виртуальным сделай, по умолчанию в С++ статическое связывание...
0
8 / 8 / 2
Регистрация: 15.12.2010
Сообщений: 41
04.10.2011, 10:47  [ТС] 6
Сделал так:
C++
1
2
3
4
5
6
7
8
9
10
class abstractMy {
};
template <class type> class My : public abstractMy {
    private:
        type *al;
    public:
        void init()
        {
        }
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
abstractMy *Some;
switch(prec)
{
    case 1:
        {
            Some = new My <float>;
        }
        break;
    case 2:
        {
            Some = new My <double>;
        }
        break;
    default:
        {
            Some = new My <float>;
        }
}
Some.init(); // left of '.init' must have class/struct/union
А вот такая запись некорректна оказалась:
C++
1
MyAbstract *class;
Я что-то не так понял?
0
В астрале
Эксперт С++
8026 / 4783 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
04.10.2011, 10:52 7
.4rray, class - keyword.
0
Заблокирован
04.10.2011, 10:53 8
Цитата Сообщение от .4rray Посмотреть сообщение
Some.init(); // left of '.init' must have class/struct/union
ну как бы нету в abstractMy метода init это раз, а кроме того что он должен там быть, неплохо бы сделать его чисто виртуальным
Цитата Сообщение от .4rray Посмотреть сообщение
MyAbstract *class;
class зарезервированное слово
0
В астрале
Эксперт С++
8026 / 4783 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
04.10.2011, 10:55 9
C++
1
Some->init();
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
typedef std::shared_ptr<abstractMy> base_ptr;
base_ptr Some;
switch(prec)
{
        case 1:
                {
                        Some = base_ptr(new My <float>());
                }
                break;
        case 2:
                {
                        Some = base_ptr(new My <double>());
                }
                break;
        default:
                {
                        Some = base_ptr(new My <float>());
                }
}
Some->init(); // left of '.init' must have class/struct/union
0
8 / 8 / 2
Регистрация: 15.12.2010
Сообщений: 41
04.10.2011, 11:35  [ТС] 10
C++
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
class abstractMy {
    public:
        abstractMy(){}; // virtual или нет, все равно не создается My от него
        ~abstractMy(){};
        virtual void Init() = 0; // virtual bool Init() = 0; или = false не получается.
};
 
template <class type> class My : public abstractMy {
    private:
        type *al;
    public:
        My()
        {
            al = NULL;
        }
        ~My()
        {
            delete [] al;
        }
        bool Init(int size)
        {
            /* */
            al = new type[size];
            return true;
            /* */
        }
}
ForEveR, а что нужно подключить для std::shared_ptr ?
0
Эксперт С++
5811 / 3462 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
04.10.2011, 11:42 11
.4rray, memory
0
В астрале
Эксперт С++
8026 / 4783 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
04.10.2011, 11:57 12
И std=c++0x
0
Делаю внезапно и красиво
Эксперт С++
1309 / 1224 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
04.10.2011, 12:11 13
Цитата Сообщение от .4rray Посмотреть сообщение
а что нужно подключить для std::shared_ptr ?
Замени на boost::shared_ptr
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.10.2011, 12:11

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как узнать Handle или PID процесса, зная его имя и класс?
Как узнать Handle или PID процесса, зная его имя и класс?

Существует ли в php по-умолчанию класс Action? И можно ли объявить класс ПОСЛЕ создания объекта?
До этого места класс &quot;Action&quot; нигде не объявлялся (и во включенных файлах тоже). Видимо, это...

Определить тип файла, не зная его расширения
делаю программу,которая пересохраняет файлы.так вот,как сделать проверку на то,что это звуковой...

Как Объявить массив Структур, где структура с типами template шаблонами
template &lt;typename Object, typename TypeFunc, typename Type1, typename Type2, typename Type3,...

Как преобразовать текстовую строку типа (y = x + 2) в уравнение чтобы можно было посчитать его зная x
Уважаемые коллеги, подскажите пожалуйста как решить такую задачу. Пользователь вводит в...

Как объявить массив, размерность которого заранее не известна
как определить массив если мы не знаем сколько элементов в нем будет? Заголовок продумываем


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.