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

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

03.10.2011, 17:46. Просмотров 1348. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.10.2011, 17:46
Ответы с готовыми решениями:

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

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

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

Как захватить динамически память, не зная заранее, какое количество памяти надо?
задание Считайте все записи из файла &quot;6.dat&quot;. Для чтения каждой отдельной...

Как прочитать последовательно все текстовые файлы лежащие в папке, не зная заранее их имен?
Подскажите плз, как прочитать последовательно все текстовые файлы лежащие в...

12
gooseim
Эксперт С++
511 / 415 / 92
Регистрация: 23.09.2010
Сообщений: 1,159
03.10.2011, 18:00 #2
Никак невозможно. Шаблоны генерятся в момент компиляции.
0
LosAngeles
Заблокирован
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
.4rray
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
LosAngeles
Заблокирован
03.10.2011, 19:34 #5
деструктор (чисто)виртуальным сделай, по умолчанию в С++ статическое связывание...
0
.4rray
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
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.10.2011, 10:52 #7
.4rray, class - keyword.
0
LosAngeles
Заблокирован
04.10.2011, 10:53 #8
Цитата Сообщение от .4rray Посмотреть сообщение
Some.init(); // left of '.init' must have class/struct/union
ну как бы нету в abstractMy метода init это раз, а кроме того что он должен там быть, неплохо бы сделать его чисто виртуальным
Цитата Сообщение от .4rray Посмотреть сообщение
MyAbstract *class;
class зарезервированное слово
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
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
.4rray
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
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
04.10.2011, 11:42 #11
.4rray, memory
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.10.2011, 11:57 #12
И std=c++0x
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
04.10.2011, 12:11 #13
Цитата Сообщение от .4rray Посмотреть сообщение
а что нужно подключить для std::shared_ptr ?
Замени на boost::shared_ptr
0
04.10.2011, 12:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2011, 12:11

Можно ли обойти динамический массив не зная его размер?
Массив ниже. Есть ли способ обойти такой массив используя указатель pArr на...

Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке?
скажем есть 2 класса class ItemList { public: ItemList(); int ...

Что объявить в классе-контейнере, чтобы его можно было перебирать поэлементно
что и как надо объявить в своем классе-контейнере, чтобы его можно было...


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

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

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