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

Выделение памяти под шаблон класса - C++

Восстановить пароль Регистрация
 
Newchap
4 / 4 / 1
Регистрация: 17.09.2013
Сообщений: 179
13.06.2014, 23:57     Выделение памяти под шаблон класса #1
Здравствуйте, надеюсь это последняя тема от меня. А то что-то много вопросов последнее время. Очень надеюсь на помощь.
Собственно, есть 2 шаблон класса, Где класс матрица наследуется от вектора. Вектор содержит в себе массив. Матрица состоит из векторов. Почти дописал прогу, но возникла проблема на 79 строке, насколько я понимаю, в этом моменте проблема возникает из-за того что Вектор пустой, т.е. инициализировался с пустым конструктором
Но как инициализировать этот вспомогательный вектор с длинной vlength?
Буду очень признателен
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// ConsoleApplication1.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <iostream>
#include <fstream>
#pragma warning(disable : 4996)
 
 
template<typename X> class vectr{     
protected: X* data_;
         int vlength; int vlength2;
public:
    vectr(){ data_ = NULL; } // дефолтный конструктор для возможности создания массива
    vectr(int vlength)  { data_ = new X[vlength]; vlength2 = vlength; }
 
    X& operator[](int i);
    vectr<X> operator+( vectr &t);
    vectr<X> operator=(vectr &t);
    template<typename X>
    friend ostream& operator<<(ostream& as, vectr<X>& u);
};
 
template<typename X>
X& vectr<X>::operator[](int i)
{
    return data_[i];
}
 
template<typename X>
vectr<X> vectr<X>::operator+(vectr &t)
{
    vectr temp;
    for (int i = 0; i < vlength; i++)
        temp.data_[i] = data_[i] + t.data_[i];
    return temp;
}
 
template<typename X>
vectr<X> vectr<X>::operator=(vectr &t)
{
    for (int i = 0; i < vlength; i++)
        data_[i] = t.data_[i];
    return *this;
}
 
template<typename X>
ostream& operator<<(ostream& as, vectr<X>& u)
{
    for (int i = 0; i < u.vlength2; i++){
        as << u.data_[i];
    }
    cout << endl;
    return as;
}
template<class T>
class matrix: protected vectr<int> //
{
    int n; 
    T v; // ошибка в выделние памяти.
    T *b;
public:
     // ошибка
    matrix() { b = NULL; };
    matrix(int n2, int vlength2)
    {
        n = n2; vlength = vlength2;
        b = new T[n];
    }
    vectr<int> v;
    void entervalue()
    {
        for (int j = 0; j < n; j++) {
            cout << "entering new vector" << endl;
            for (int i = 0; i < vlength; i++)
            {
            //  v[i]=i;// ошибка
            }
            cout << "Kek2";
            //b[j] = v;
        }
 
    //  cout << endl;
        for (int i = 0; i < n; i++)
            cout << b[i];
    }
 
    matrix operator+(matrix &t);
    matrix operator=(matrix &t);
    vectr& operator[](int i);
    friend ostream& operator<<(ostream& as, matrix& u);
};
 
 
template<class T>
matrix<T> matrix<T>::operator=(matrix<T> &t)
{
    for (int i = 0; i < n; i++)
        b[i] = t.b[i];
    return *this;
}
template<class T>
matrix<T> matrix<T>::operator+(matrix &t)
{
    matrix temp;
    for (int i = 0; i < n; i++)
        temp.b[i] = b[i] + t.b[i];
    return temp;
}
template<class T>
vectr<int>& matrix<T>::operator[](int i)
{
    return b[i];
}
template<class T>
ostream& operator<<(ostream& as, matrix<T>& u)
{
    cout << endl;
    for (int i = 0; i < u.n; i++)
        as << u.b[i];
    return as;
}
int _tmain(int argc, _TCHAR* argv[])
{ 
int n;
int vlength; // длина вектора
    cout << "enter number of vectors" << endl;
 cin >> n;
 cout << "enter length of vector" << endl;
 cin >> vlength;
 cout << "testing vectr class" << endl;
 vectr<int> v2(vlength);
 for (int i = 0; i < vlength; i++)
     v2[i] = i;
 cout << v2<< " ";
 //сделаем матрицу векторов.
    matrix<vectr<int>> Mt(n,vlength);
    Mt.entervalue();
    //cout << "testing << operator for matrix class";
    //cout << Mt;
    //cout << "testing = operator for matrix class";
    //matrix testm(n, vlength);
    //cout << "enter second matrix"<<endl;
    //testm.entervalue();
    //Mt = testm;
    //cout << Mt;
    //cout << "now testing + operator" << endl;
        //testm = Mt + Mt;
        //cout << testm;
    return 0; // переделать для работы с шаблонами
}
Добавлено через 3 часа 40 минут
бамп, спасите-помогите. Очень надо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2014, 23:57     Выделение памяти под шаблон класса
Посмотрите здесь:

Выделение памяти под масссив C++
Шаблон и выделение памяти C++
Выделение памяти под матрицу C++
динамическое выделение памяти под объект класса C++
выделение памяти под wchar_t C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.06.2014, 00:36     Выделение памяти под шаблон класса #2
Цитата Сообщение от Newchap Посмотреть сообщение
Матрица состоит из векторов.
И зачем здесь тогда:
Цитата Сообщение от Newchap Посмотреть сообщение
класс матрица наследуется от вектора.
Newchap
4 / 4 / 1
Регистрация: 17.09.2013
Сообщений: 179
14.06.2014, 08:18  [ТС]     Выделение памяти под шаблон класса #3
alsav22, лично у меня это было для того, чтобы класс матрица имел доступ к протектед элементам вектора.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.06.2014, 16:37     Выделение памяти под шаблон класса #4
Цитата Сообщение от Newchap Посмотреть сообщение
это было для того, чтобы класс матрица имел доступ к протектед элементам вектора
Если в матрице есть вектор, то он, через методы своего класса, имеет доступ к своим защищённым элементам.
Newchap
4 / 4 / 1
Регистрация: 17.09.2013
Сообщений: 179
16.06.2014, 13:57  [ТС]     Выделение памяти под шаблон класса #5
alsav22, исправил, но теперь ошибка на 91 строке. Спасите-помогите, завтра сдавать бы пора.
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
// ConsoleApplication1.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <iostream>
#include <fstream>
#pragma warning(disable : 4996)
 
 
template<typename X> class vectr{     
public: X* data_;
         int vlength;
public:
    vectr(){ data_ = NULL; } // дефолтный конструктор для возможности создания массива
    vectr(int vlength2)  { data_ = new X[vlength]; vlength = vlength2; }
 
    void vfill()
    {
        for (int i = 0; i < vlength; i++)
            cin >> data_[i];
    }
 
    X& operator[](int i);
    vectr<X> operator+( vectr &t);
    vectr<X> operator=(vectr &t);
    template<typename X>
    friend ostream& operator<<(ostream& as, vectr<X>& u);
};
 
template<typename X>
X& vectr<X>::operator[](int i)
{
    return data_[i];
}
 
template<typename X>
vectr<X> vectr<X>::operator+(vectr &t)
{
    vectr temp;
    for (int i = 0; i < vlength; i++)
        temp.data_[i] = data_[i] + t.data_[i];
    return temp;
}
 
template<typename X>
vectr<X> vectr<X>::operator=(vectr &t)
{
    for (int i = 0; i < vlength; i++)
        data_[i] = t.data_[i];
    return *this;
}
 
template<typename X>
ostream& operator<<(ostream& as, vectr<X>& u)
{
    for (int i = 0; i < u.vlength; i++){
        as << u.data_[i];
    }
    cout << endl;
    return as;
}
template<class T>
class matrix
{
    int n, vlength; 
   //T v(); // ошибка в выделние памяти.
    T *b;
    
public:
     // ошибка
    matrix() { b = NULL; };
    matrix(int n2, int vlength2)
    {
        n = n2;  vlength = vlength2;
        b = new T[n];
    }
 
    void entervalue()
    {
    //  vectr<int> v2(vlength);
        T v2(vlength);
        for (int j = 0; j < n; j++) 
        {
            cout << "enter vector"<<endl;
            v2.vfill();
            b[j] = v2;
        }
        v2 = b[0];
        cout << endl;
        //for (int i = 0; i < n; i++)
            //cout << b[i];
    }
 
    matrix operator+(matrix &t);
    matrix operator=(matrix &t);
    vectr<int>& operator[](int i);
    friend ostream& operator<<(ostream& as, matrix& u);
};
 
 
template<class T>
matrix<T> matrix<T>::operator=(matrix<T> &t)
{
    for (int i = 0; i < n; i++)
        b[i] = t.b[i];
    return *this;
}
template<class T>
matrix<T> matrix<T>::operator+(matrix &t)
{
    matrix temp;
    for (int i = 0; i < n; i++)
        temp.b[i] = b[i] + t.b[i];
    return temp;
}
template<class T>
vectr<int>& matrix<T>::operator[](int i)
{
    return b[i];
}
template<class T>
ostream& operator<<(ostream& as, matrix<T>& u)
{
    cout << endl;
    for (int i = 0; i < u.n; i++)
        as << u.b[i];
    return as;
}
int _tmain(int argc, _TCHAR* argv[])
{ 
int n;
int vlength; // длина вектора
    cout << "enter number of vectors" << endl;
 cin >> n;
 cout << "enter length of vector" << endl;
 cin >> vlength;
/* cout << "testing vectr class" << endl;
 vectr<int> v2(vlength);
 v2.vfill();
 cout << v2;*/
 
 //сделаем матрицу векторов.
    matrix<vectr<int>> Mt(n,vlength);
    Mt.entervalue();
    //cout << "testing << operator for matrix class";
    //cout << Mt;
    //cout << "testing = operator for matrix class";
    //matrix testm(n, vlength);
    //cout << "enter second matrix"<<endl;
    //testm.entervalue();
    //Mt = testm;
    //cout << Mt;
    //cout << "now testing + operator" << endl;
        //testm = Mt + Mt;
        //cout << testm;
    return 0; // переделать для работы с шаблонами
}
Добавлено через 31 минуту
Вернее, я понимаю, почему здесь ошибка. Он дает массиву который инициализировался с "пустым" конструктором не пустой вектор, но как это решить?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.06.2014, 17:34     Выделение памяти под шаблон класса #6
Это конструктор как должен работать?
C++
1
2
3
4
5
    vectr(int vlength2)  
    { 
        data_ = new X[vlength]; 
        vlength = vlength2; 
    }
Сначала память выделили, потом значение задали?
Newchap
4 / 4 / 1
Регистрация: 17.09.2013
Сообщений: 179
16.06.2014, 17:45  [ТС]     Выделение памяти под шаблон класса #7
alsav22, Я это исправил уже потом, поменял местами строки, но с моей проблемой это не помогло.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.06.2014, 18:01     Выделение памяти под шаблон класса #8
Цитата Сообщение от Newchap Посмотреть сообщение
но с моей проблемой это не помогло.
Естественно, но об исправлениях нужно писать, или код исправленный выкладывать, чтобы попусту время не тратить.
Присваивание неправильно реализовано (в matrix тоже):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<typename X>
vectr<X> vectr<X>::operator=(vectr &t)
{
    if (this != &t)
    {
        delete [] data_;
        vlength = t.vlength;
        data_ = new X[vlength];
        
        for (int i = 0; i < vlength; i++)
            data_[i] = t.data_[i];
    }
    return *this;
}
Конструктор нужно изменить:
C++
1
2
3
4
5
6
7
matrix(int n2, int vlength2)
{
        n = n2;  vlength = vlength2;
        b = new T[n];
        for (int i = 0; i < n; ++i)
            b[i] = T(vlength);
}
Конструкторы копирования и деструкторы должны быть.
Newchap
4 / 4 / 1
Регистрация: 17.09.2013
Сообщений: 179
16.06.2014, 19:36  [ТС]     Выделение памяти под шаблон класса #9
alsav22, Спасибо, не додумался сам.
Впредь буду постить исправления, если найду, не учел это дело.

Добавлено через 26 минут
alsav22, Я, видимо, что-то опять не понял, исправил то что вы сказали, = для матрицы ещё не переделывал, но виснет теперь там, где запускается функция Ентер матрица, конструктор нормально, а вот перегруженный оператор ведет к повисанию программы.

Добавлено через 25 минут
Перегрузил след. образом. Все ещё не рабит
C++
1
2
3
4
5
6
7
8
9
10
11
template<class T>
matrix<T> matrix<T>::operator=(matrix<T> &t)
{
    if (this != &t){
        delete [] b;
        n = t.n;
        for (int i = 0; i < n; i++)
            b[i] = t.b[i];
    }
    return *this;
}
Добавлено через 25 минут
удалил Делит из перегрузки - работает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2014, 20:51     Выделение памяти под шаблон класса
Еще ссылки по теме:

C++ Выделение памяти под структуры
Выделение памяти под указатель C++
C++ Выделение динамической памяти под массив из класса

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.06.2014, 20:51     Выделение памяти под шаблон класса #10
Цитата Сообщение от Newchap Посмотреть сообщение
Перегрузил след. образом. Все ещё не рабит
Как перегружается я показал. Память освободили, а новую кто будет выделять?
Yandex
Объявления
16.06.2014, 20:51     Выделение памяти под шаблон класса
Ответ Создать тему
Опции темы

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