Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
.4rray
8 / 8 / 0
Регистрация: 15.12.2010
Сообщений: 41
03.10.2011, 17:46     Как можно объявить класс, заранее не зная его тип template. #1
Класс:
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 поколдовать или ещё что-то?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.10.2011, 17:46     Как можно объявить класс, заранее не зная его тип template.
Посмотрите здесь:

C++ Можно ли задать массив, не зная заранее его длину?
C++ Как узнать Handle или PID процесса, зная его имя и класс?
C++ typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения
C++ как захватить динамически память, не зная заранее какое количество памяти надо?
C++ Как объявить указатель на массив через typedef и как инициализировать такой тип
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
03.10.2011, 18:00     Как можно объявить класс, заранее не зная его тип template. #2
Никак невозможно. Шаблоны генерятся в момент компиляции.
LosAngeles
Заблокирован
03.10.2011, 18:36     Как можно объявить класс, заранее не зная его тип template. #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>;
        }
.4rray
8 / 8 / 0
Регистрация: 15.12.2010
Сообщений: 41
03.10.2011, 19:31  [ТС]     Как можно объявить класс, заранее не зная его тип template. #4
Спасибо, попробую.
Я так понял создать абстрактный класс :
C++
1
2
3
4
5
6
7
8
class abstractMy {
                virtual abstractMy()
                {
                }
                virtual ~abstractMy()
                {
                }
}
И тогда, приведенная вами выше, конструкция сработает?

// оу, точно. А то получится совсем не то)
LosAngeles
Заблокирован
03.10.2011, 19:34     Как можно объявить класс, заранее не зная его тип template. #5
деструктор (чисто)виртуальным сделай, по умолчанию в С++ статическое связывание...
.4rray
8 / 8 / 0
Регистрация: 15.12.2010
Сообщений: 41
04.10.2011, 10:47  [ТС]     Как можно объявить класс, заранее не зная его тип template. #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;
Я что-то не так понял?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.10.2011, 10:52     Как можно объявить класс, заранее не зная его тип template. #7
.4rray, class - keyword.
LosAngeles
Заблокирован
04.10.2011, 10:53     Как можно объявить класс, заранее не зная его тип template. #8
Цитата Сообщение от .4rray Посмотреть сообщение
Some.init(); // left of '.init' must have class/struct/union
ну как бы нету в abstractMy метода init это раз, а кроме того что он должен там быть, неплохо бы сделать его чисто виртуальным
Цитата Сообщение от .4rray Посмотреть сообщение
MyAbstract *class;
class зарезервированное слово
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.10.2011, 10:55     Как можно объявить класс, заранее не зная его тип template. #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
.4rray
8 / 8 / 0
Регистрация: 15.12.2010
Сообщений: 41
04.10.2011, 11:35  [ТС]     Как можно объявить класс, заранее не зная его тип template. #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 ?
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
04.10.2011, 11:42     Как можно объявить класс, заранее не зная его тип template. #11
.4rray, memory
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.10.2011, 11:57     Как можно объявить класс, заранее не зная его тип template. #12
И std=c++0x
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2011, 12:11     Как можно объявить класс, заранее не зная его тип template.
Еще ссылки по теме:

Как прочитать последовательно все текстовые файлы лежащие в папке, не зная заранее их имен? C++
C++ Что объявить в классе-контейнере, чтобы его можно было перебирать поэлементно
C++ Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке?

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
04.10.2011, 12:11     Как можно объявить класс, заранее не зная его тип template. #13
Цитата Сообщение от .4rray Посмотреть сообщение
а что нужно подключить для std::shared_ptr ?
Замени на boost::shared_ptr
Yandex
Объявления
04.10.2011, 12:11     Как можно объявить класс, заранее не зная его тип template.
Ответ Создать тему
Опции темы

Текущее время: 13:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru