Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 27.12.2009
Сообщений: 5
1

Как правильно вызывать конструктор шаблонного класса?

11.04.2010, 15:37. Просмотров 672. Ответов 2
Метки нет (Все метки)

Как правильно вызывать конструктор класса?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template <class T> class A{
    T *v;
    int dim;
public:
    A(T *a,int n);
    
};
template <class T> А<T>::А(T *a,int n){
    if(n<=0){
        fprintf(stderr,"dimension must be positive\n");
        exit(1);}
    dim=n;
    v=new T[n];
    for(int i=0;i<dim;i++) v[i]=a[i];
}
int main(int argc, char* argv[]){ 
    
    int a[5]={4,-3,87,2,-45};
    A v=A(a,5);//до того, как создавать шаблон, он вызывался так
        A<int> v(a,5); //такая запись обнуляет все значения а, а нужно, чтобы
       // вектор v приобрел значения массива а. Как это сделать?
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.04.2010, 15:37
Ответы с готовыми решениями:

Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра?
header.h template &lt;class T&gt; class MyVector { public: void swap(MyVector&lt;T&gt;Vector); }...

Конструктор копирования шаблонного класса
Всем доброго времени суток! Язык С++ изучаю относительно недавно и столкнулся с задачей, которую не...

Конструктор копий для шаблонного класса(связный список)
Не совсем понятно как копировать объекты из динамической памяти, в частности правильная реализация...

Контруктор шаблонного класса: почему в заданном коде необходим конструктор без параметров?
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;dcl.hpp&gt; #include &lt;string&gt; using namespace...

2
1257 / 795 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
11.04.2010, 16:54 2
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
28
29
30
31
32
33
34
35
36
37
38
#include "iostream"
 
template <class T> 
class A{
        T *v;
        int dim;
 
public:
A(T *a,int n);
virtual ~A(){ delete []v ; } //освобождение памяти
 
void show(){
    for( int i = 0 ; i < dim ; i++)std::cout<<v[i]<<' ';
    std::cout<<'\n';
}
        
};
 
template <class T> 
A<T>::A(T *a,int n){
        if(n<=0){
            std::cout<<"dimension must be positive\n";
                exit(1);}
        dim=n;
        v=new T[n];
        for(int i=0;i<dim;i++) v[i]=a[i];
}
 
 
 
int main(int argc, char* argv[]){ 
       
        int a[5]={4,-3,87,2,-45};
        A<int> v(a,5); 
        v.show();
    
 return 0; 
}
Добавлено через 9 минут
Забыл ещё приделать конструктор копирования и операцию присваивания щас прикручу.

Добавлено через 12 минут
Вот более менее законченный пример.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "iostream"
 
 
template <class T> 
class A{
        T *v;
        int dim;
 
public:
 
A(T *a,int n);
A(const A<T>&p);
const A<T>operator =(const A<T>&p);
 
virtual ~A(){ delete []v ; } //освобождение памяти
 
void show(){
        for( int i = 0 ; i < dim ; i++)std::cout<<v[i]<<' ';
        std::cout<<'\n';
}
        
};
 
template <class T> 
A<T>::A(T *a,int n){
        if(n<=0){
                        std::cout<<"dimension must be positive\n";
                exit(1);}
        dim=n;
        v=new T[n];
        for(int i=0;i<dim;i++) v[i]=a[i];
}
 
 
//конструктор копирования.
template <class T> 
A<T>::A(const A<T>&p){
v = new T[p.dim];  //выделяем память
dim=p.dim;
for( int i = 0; i < p.dim ; i++ )v[i]=p.v[i];  //копируем.
}
 
 
template <class T> 
const A<T> A<T>::operator = (const A<T>&p){
if(&p==this)return *this;
 
delete []v;
v = new T[p.dim];
 
dim = p.dim;
for( int i = 0; i <p.dim ; i++ )v[i]=p.v[i];
return *this;
}
 
int main(int argc, char* argv[]){ 
       
        int a[5]={4,-3,87,2,-45};
 
        int k[5]={1,1,1,1,1};
 
        A<int> v(a,5); 
        v.show();
        A<int> b(v); //копируем.
        b.show(); 
 
        A<int> c(k,5);
 
        c.show();
        c = v;       //присваиваем.
        c.show();
 
    A<int> r = A<int>(k,5);
        r.show();
    
    
 return 0; 
}
2
0 / 0 / 0
Регистрация: 27.12.2009
Сообщений: 5
11.04.2010, 18:43  [ТС] 3
Спасибо большое!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.04.2010, 18:43

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

Почему в списке инициализации конструктора дочернего класса нельзя вызывать конструктор родительского через его пространство имён?
Есть класс D и от него порождён класс Wd Тут вот например всё работает корректно (использую...

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор *
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор...

Вызов метода у шаблонного поля, шаблонного класса
Пытаюсь разобраться с шаблонами- задача создать шаблонный класс, у которого есть шаблонное поле. и...

Инициализация шаблонного класса(В конструкторе класса после двоеточия вновь имя класса)
Всем доброго времени суток! Пытаюсь разобраться как работает приведенный мной код. Конкретно,...


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

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

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