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

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

Войти
Регистрация
Восстановить пароль
 
Вероника99
5 / 5 / 1
Регистрация: 16.12.2013
Сообщений: 429
#1

Возвратить тип шаблона,так чтобы результат при вызове присваивался объекту - C++

09.05.2014, 19:08. Просмотров 244. Ответов 5
Метки нет (Все метки)

Есть матрица,нужно создать новую матрицу и "перевернуть" (т.е. столбцы становятся строками,а строки-стобцами)-это сделано. Потом нужно сделать так,чтобы метод возвращал такое значение (типа array<T>),чтобы его можно было присвоить новому объекту в main. Я не знаю,как cделать так,чтобы новая матрица могла бы находиться в этом новом объекте из main.
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
#include "stdafx.h"
#include <iostream>
#include <cstring>
using namespace std;
 
template <typename T>
class array
{
private:
    T **p; //базовая матрица
    int size;
    int row,column;
public:
    array(int a,int b)
    {
        row=a;column=b;
        //cout<<" a= "<<a;
        p=new int *[a*b];
        for(int i=0;i<(a*b);i++)
        
            p[i]=new int[(a*b)];    
    }
 
 
    ~array(){for(int i=0;i<row*column;i++) delete [] p[i]; };
    void enter();
    void copycolumn();
    void copyrow(const array<T>&);
    void choose();
    void show();
};
 
int main()
{
    array <int> myArray(2,3);
    cout << "Enter numbers for matrix: \n";
     myArray.enter();
    cout << "Matrix: \n";
    myArray.show();
    myArray.copycolumn();
    
    myArray.copyrow(myArray); //метод,который должен возвращать это значение
    
    myArray.choose();
 
}
void array<T>::copyrow(const array<T> &myArray)
{
 
    array <int> myArray1(myArray); //думаю,здесь нужно тоже объявить объект,чтобы его возвращать,но как именно //в этот объект поместить новую матрицу????
    cout<<"\n";
    int **r=new int*[column*row]; //новая матрица
    for(int i=0;i<(column*row);i++)
        {
            r[i]=new int[column*row];   
        }
 
        cout<<"\nCopy mtx:\n";
    for(int i=0;i<column;i++)
            for(int j=0;j<row;j++)              
    {   
        r[j][i]=p[j][i];
        
    }
 
        for(int i=0;i<column;i++)
        {   cout<<"\n";
            for(int j=0;j<row;j++)      
                cout<<r[j][i]<<" ";
                
            
        }
 
 //return myArray1;
}
Добавлено через 20 часов 58 минут
Никто не знает?(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2014, 19:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возвратить тип шаблона,так чтобы результат при вызове присваивался объекту (C++):

Как сделать так чтобы при каждом выделении памяти в методе была возможность ее очистить и вернуть результат? - C++
Доброго времени суток! Есть код класса и хотелось бы устранить в нем следующие недочеты: 1) Как сделать так чтобы при каждом выделении...

Оошибка при вызове шаблона функции в другом классе - C++
цель моей функции- выводить значения переменной в любом формате. функция в классе : .h class A { template &lt;typename Variable&gt; ...

Как обратиться к объекту bitset так, чтобы результатом была битовая маска - C++
Здравствуйте, для образовательных целей решил научится работать с bitset, как я понял класс эмулирует массив с размером элемента 1 бит....

Как сделать чтобы из шаблона всегда возвращался тип наибольшего размера - C++
Есть задача сделать простой калькулятор. Операции решил определить через шаблоны. В шаблон в общем случае передается 2 параметра...

Неверный тип параметра при вызове функции write потока ofstream - C++
error C2664: std::basic_ostream&lt;_Elem,_Traits&gt;::write: невозможно преобразовать параметр 1 из 'char' в 'const char *' #include...

Как сделать так чтобы результат выводился в градусах ? - C++
Нужно что бы результат выводился в градусах, а то он выводит числа типо 0.0000034 и т д Если надо могу написать программу сюда С++

5
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3139 / 307
Регистрация: 04.12.2011
Сообщений: 8,661
Записей в блоге: 5
10.05.2014, 02:42 #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
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
#include <iostream>
using namespace std;
 
template <typename T>
class array
{
//private:
public://не вижу метода заполнения, а писать не хочется
    T **p; //базовая матрица
    int row,column;
public:
    array(int a,int b)
    {
        row=a;column=b;       
       p=new T *[row];
        for(int i=0;i<row;i++)
        
            p[i]=new T[column];    
    }
    ~array(){for(
        int i=0;i<row;i++) delete [] p[i]; 
    delete []p;
    };
    void enter();
    void copycolumn();
    void copyrow(array<T>&);
    void choose();
    void show();
};
 
int main()
{
    array <int> myArray(2,3);
    for(int i=0;i<myArray.row;i++){
        for(int j=0;j<myArray.column;j++){
    myArray.p[i][j]=j;
    cout<<myArray.p[i][j]<<" ";
            }
cout<<endl;
    }
   array <int> myArray1(3,2);
    
    myArray.copyrow(myArray1); //метод,который должен возвращать это значение
    cout<<endl;
  for(int i=0;i<myArray1.row;i++){
        for(int j=0;j<myArray1.column;j++){
    cout<<myArray1.p[i][j]<<" ";
            }
cout<<endl;
    }     
cout<<endl;
system("pause");
return 0;
}
template <typename T> 
void 
array<typename T>::
copyrow (array &myArray)
{
for(int i=0;i<myArray.row;i++)
for(int j=0;j<myArray.column;j++){
myArray.p[i][j]=p[j][i];
}
}
0
Вероника99
5 / 5 / 1
Регистрация: 16.12.2013
Сообщений: 429
10.05.2014, 15:01  [ТС] #3
IGPIGP ,спасибо за ответ,я уже разобралась,что нужно было делать. Я просто в методе copyrow создала объект и в классе создала конструктор копирования,в котором "переворачивается" матрица,таким образов в этом методе я вызывают конструктор копирования для нового объекта и возвращаю объект в main,где присваиваю возвращаемый результат еще одному новому объекту.Это как раз то,что и требовалось сделать)
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3139 / 307
Регистрация: 04.12.2011
Сообщений: 8,661
Записей в блоге: 5
10.05.2014, 15:19 #4
Цитата Сообщение от Вероника99 Посмотреть сообщение
спасибо
Да бросьте.
Цитата Сообщение от Вероника99 Посмотреть сообщение
я уже разобралась,что нужно было делать.
Судя по попытке возврата по константной ссылке и ряду других признаков не буду и пробовать и в это поверить.
Перед тем как разбирать шаблоны, лучше повторить более простые вещи.
Цитата Сообщение от Вероника99 Посмотреть сообщение
Я просто в методе copyrow создала объект
И вернули ссылку на него? Если это не динамический объект, то:
<<Перед тем как разбирать шаблоны, лучше повторить более простые вещи.>>
Если динамический, то это можно, но тот факт, что всегда нужно будет помнить, что такой объект нужно будет удалить (за пределами области где он создан), делает такой подход малопривлекательным.
Создать и инициализировать ( в с++ к счастью по другому и нельзя) ссылку, а потом передать в функцию ожидая по ней возврат, это лучше. Впрочем, как знаете.
0
Вероника99
5 / 5 / 1
Регистрация: 16.12.2013
Сообщений: 429
10.05.2014, 20:37  [ТС] #5
<<Создать и инициализировать ( в с++ к счастью по другому и нельзя) ссылку, а потом передать в функцию ожидая по ней возврат, это лучше. Впрочем, как знаете.>>
Да,хорошая идея,может так тоже сделаю.
Кстати почему-то компилер ругается на деструктор
Вот код
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
#include "stdafx.h"
#include <iostream>
#include <cstring>
using namespace std;
#define K 5
template <typename T>
class array
{
private:
    T **p;
    int size;
    int row,column;
    //int mtx[K][K];
public:
 
    array(int a,int b)
    {
        row=a;column=b;
        //cout<<" a= "<<a;
        p=new int *[a*b];
        for(int i=0;i<(a*b);i++)
        {
            p[i]=new int[(a*b)];
 
        
        }
/*      for(int i=0;i<row;i++)
          for( int j=0;j<column;j++)
          {  
                p[i][j]=a*b;
                    cout<<" "<<p[i][j];
        
        }*/
    }
 
 
    //~array(){for(int i=0;i<row*column;i++) delete [] p[i]; };
    void enter();
    void copycolumn();
    int GetRow(){return row;}
    array<T>  copyrow(const array<T>&);
    void choose();
    void show();
 
 
    array(const array &myArray) //конструктор копирования
{
    column=myArray.column;
    row=myArray.row;
    cout<<" Col"<<column<<"Row "<<row;
    p=myArray.p;
//  cout<<"\n p="<<p;
/*  for(int i=0;i<(column*row);i++)
        {
            this->p[i]=new int[column*row];
        }*/
        
        for(int i=0;i<column;i++)
            for(int j=0;j<row;j++)              
    {   
        this->p[j][i]=myArray.p[j][i];
    
    }
            for(int i=0;i<column;i++)
        {   cout<<"\n";
            for(int j=0;j<row;j++)      
                cout<<this->p[j][i]<<" ";           
        }
        
 
}
};
 
int main()
{
    array <int> myArray(2,3);
    cout << "Enter numbers for matrix: \n";
     myArray.enter();
    cout << "Matrix: \n";
    myArray.show();
    myArray.copycolumn();
    array <int> myArray2(myArray.copyrow(myArray));
    //array <int> myArray1(myArray);
//  myArray1=myArray.GetRow();
    //myArray1=myArray.copyrow();
    myArray.choose();
    
 
}
 
template <typename T>
void array<T>::choose()
{
    char str[10];
    int n,m;
    T **d=new int*[column*row];
    for(int i=0;i<(column*row);i++)
        {
            d[i]=new int[column*row];
        
        }
    cout<<"What do you want to choose: column or row? (write word)\n";
    a:cin>>str;
    if(strcmp(str,"row")==0)
    {   
        cout<<"row"<<row;
        cout<<"\nEnter number of "<<str<<" ";
        v:cin>>m;
        m=m-1;
            if(m>=row)
            {
                cout<<"It's number more than limit,enter one more time\n";
                goto v;
            }
        int j=m;
        for(int i=0;i<column;i++)
        
            d[i]=p[i]; 
        
            for(int i=0;i<column;i++)
                cout<<" "<<d[j][i]; 
    }
    else if(strcmp(str,"column")==0)
    {   
        cout<<"column";
        cout<<"\nEnter number of "<<str<<" ";
        b:cin>>n;
        n=n-1;
            if(n>=column)
            {
                cout<<"It's number more than limit,enter one more time\n";
                goto b;
            }
            
    int j=n;
    for(int i=0;i<row;i++)
    {   
        d[i]=p[i];
        cout<<d[i][j]<<" ";
        cout<<"\n";
    }
        
    
    }
    else if(1)
    {
        cout<<"Error,enter one more time\n";
        goto a;
 
    }
    
}
 
template <typename T>
array<T> array<T>::copyrow(const array<T> &myArray)
{
 
    
    //myArray1.show();
    cout<<"\n";
    int **r=new int*[column*row];
    for(int i=0;i<(column*row);i++)
        {
            r[i]=new int[column*row];
 
        
        }
    //int j=0;
        cout<<"\nCopy mtx:\n";
        array <int> myArray1(myArray);
/*  for(int i=0;i<column;i++)
            for(int j=0;j<row;j++)              
    {   
        r[j][i]=p[j][i];
        
    }
 
        for(int i=0;i<column;i++)
        {   cout<<"\n";
            for(int j=0;j<row;j++)      
                cout<<r[j][i]<<" ";         
        }*/
 
 return myArray1;
}
 
 
 
template <typename T>
void array<T>::copycolumn()
{
    int **c=new int*[column*row];
    for(int i=0;i<(column*row);i++)
        {
            c[i]=new int[column*row];
 
        
        }
    int j=1;
    cout<<"\nCopy column:\n";
    for(int i=0;i<row;i++)
    {   
        c[i]=p[i];
        cout<<c[i][j]<<" ";
        cout<<"\n";
    }
 
}
template <typename T>
void array<T>::enter()
    {
    
        for(int i=0;i<row;i++)
          for( int j=0;j<column;j++)
          {  
                cin>>p[i][j];
                    //cout<<" "<<p[i][j];
        
        }
    }
 
template <typename T>
void array<T>::show()
{
    int temp;
    for(int i=0;i<row;i++)
                {
                    for(int j=0;j<column;j++)
                
                    cout<<p[i][j]<<" ";
                    cout<<"\n";
                
                }
                
}
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3139 / 307
Регистрация: 04.12.2011
Сообщений: 8,661
Записей в блоге: 5
10.05.2014, 21:28 #6
Цитата Сообщение от Вероника99 Посмотреть сообщение
Кстати почему-то компилер ругается на деструктор
Я уже писал, что у вас куча проблем не связанных с шаблонами. А компилятор не ругается и на конструктор потому только, что не знает, что вы хотите сделать. Посмотрите деструктор в моём коде (как и на конструктор) там всё тихо. Без ругани.
0
10.05.2014, 21:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2014, 21:28
Привет! Вот еще темы с ответами:

Расставить знаки арифметических операций так, чтобы сошелся результат - C++
Разработать программу, отыскивающую такую расстановку знаков арифметических операций +, -, *, / вместо знака ? в выражении ((((1?2) ?...

Переделать программу так, чтобы можно было сохранить результат обработки - C++
есть код, который убирает комментарии в коде, но можно ли сделать так, чтобы она брала файл txt, обрабатывала и сохраняла готовый результат...

В выражении расставить знаки так, чтобы результат вычислений был равен 35 - C++
В выражении (((( 1 ? 2 ) ? 3 ) ? 4 ) ? 5 ) ? 6 вместо каждого знака ? поставить знак одной из операций + , - , * , / так , чтобы...

Класс - Ошибки при вызове методов: В вызове функции отсутствует список аргументов - C++
Добрый вечер всем! При изучении и написании работы столкнулся с ошибкой от которой не могу избавиться. (Т.к. очень сильно плаваю в ООП)....


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

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

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