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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
.4rray
8 / 8 / 0
Регистрация: 15.12.2010
Сообщений: 41
#1

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

03.10.2011, 17:46. Просмотров 1241. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как можно объявить класс, заранее не зная его тип template. (C++):

Можно ли задать массив, не зная заранее его длину? - C++
Доброе утро всем. Вчера начал читать &quot;главу 4 Массивы&quot;. Там предложили 2 варианта объявления массива: 1) неинициализированный int...

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

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

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

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

Можно ли обойти динамический массив не зная его размер? - C++
Массив ниже. Есть ли способ обойти такой массив используя указатель pArr на него? Не используя count. int count = 7; int...

12
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 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 / 0
Регистрация: 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 / 0
Регистрация: 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
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 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
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 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 / 0
Регистрация: 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
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
04.10.2011, 11:42 #11
.4rray, memory
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
04.10.2011, 11:57 #12
И std=c++0x
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
04.10.2011, 12:11 #13
Цитата Сообщение от .4rray Посмотреть сообщение
а что нужно подключить для std::shared_ptr ?
Замени на boost::shared_ptr
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2011, 12:11
Привет! Вот еще темы с ответами:

Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? - C++
скажем есть 2 класса class ItemList { public: ItemList(); int item; int count; Func*func; }

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

typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения - C++
Вот код: #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &lt;typeinfo&gt; using...

Как объявить указатель на массив через typedef и как инициализировать такой тип - C++
Как заставить заработать этот фрагмент кода? INT_L -- указатель на массив из 100 элементов типа char; Не получается в переменную C...


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

Или воспользуйтесь поиском по форуму:
13
Yandex
Объявления
04.10.2011, 12:11
Ответ Создать тему
Опции темы

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