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

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

Войти
Регистрация
Восстановить пароль
 
Newchap
4 / 4 / 1
Регистрация: 17.09.2013
Сообщений: 179
#1

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

13.06.2014, 23:57. Просмотров 383. Ответов 9
Метки нет (Все метки)

Здравствуйте, надеюсь это последняя тема от меня. А то что-то много вопросов последнее время. Очень надеюсь на помощь.
Собственно, есть 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 минут
бамп, спасите-помогите. Очень надо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2014, 23:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выделение памяти под шаблон класса (C++):

Выделение динамической памяти под массив из класса - C++
Допустим, есть class c, и он включает в себя char-массив a: class c { private: char a; public: c(); c(char* a); }

Динамическое выделение памяти под объект класса - C++
Помогите динамически выделить память под объект класса.

Шаблон и выделение памяти - C++
#include &lt;iostream&gt; template&lt;class T&gt; T CreateArray(T a, int n) { a = new T ; // ошибка: double* = double** return a; ...

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

Выделение памяти под матрицу - C++
Всем привет. float **AllocMat(int Rows, int Colomns) { float ** Mat; try { Mat = new...

Выделение памяти под структуру - C++
enrollee *p=new enrollee; после работы delete p; выбивает ошибку. неправильно очищаю???

9
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.06.2014, 00:36 #2
Цитата Сообщение от Newchap Посмотреть сообщение
Матрица состоит из векторов.
И зачем здесь тогда:
Цитата Сообщение от Newchap Посмотреть сообщение
класс матрица наследуется от вектора.
0
Newchap
4 / 4 / 1
Регистрация: 17.09.2013
Сообщений: 179
14.06.2014, 08:18  [ТС] #3
alsav22, лично у меня это было для того, чтобы класс матрица имел доступ к протектед элементам вектора.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.06.2014, 16:37 #4
Цитата Сообщение от Newchap Посмотреть сообщение
это было для того, чтобы класс матрица имел доступ к протектед элементам вектора
Если в матрице есть вектор, то он, через методы своего класса, имеет доступ к своим защищённым элементам.
1
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 минуту
Вернее, я понимаю, почему здесь ошибка. Он дает массиву который инициализировался с "пустым" конструктором не пустой вектор, но как это решить?
0
alsav22
5426 / 4821 / 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; 
    }
Сначала память выделили, потом значение задали?
0
Newchap
4 / 4 / 1
Регистрация: 17.09.2013
Сообщений: 179
16.06.2014, 17:45  [ТС] #7
alsav22, Я это исправил уже потом, поменял местами строки, но с моей проблемой это не помогло.
0
alsav22
5426 / 4821 / 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);
}
Конструкторы копирования и деструкторы должны быть.
1
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 минут
удалил Делит из перегрузки - работает.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.06.2014, 20:51 #10
Цитата Сообщение от Newchap Посмотреть сообщение
Перегрузил след. образом. Все ещё не рабит
Как перегружается я показал. Память освободили, а новую кто будет выделять?
0
16.06.2014, 20:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2014, 20:51
Привет! Вот еще темы с ответами:

Выделение памяти под массив - C++
в массиве данных хранять в последовательных ячейках памяти В программе, выделенна память под массив, для ввода данных пользователем. ...

Выделение памяти под указатель - C++
Здравствуйте форумчане,у меня возник маленький вопрос:) Почему sizeof(char) дает результат в 1 байт, а sizeof(char*) ) дает 4 байта.Как...

Выделение памяти под переменную - C++
Драсте, уважаемые. Мне надо выделить переменную на 25мег, чтоб в ней хранить все просчёты выполненые программой. (Пробовал в BCB6 и в BCW...

Выделение памяти под структуру - C++
Наведите пример выделения памяти под структуру


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

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

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