Мне нужно создать шаблон класса для двухмерного массива; каждая переменная в массиве получит случайное значение [65;90], мне нужно найти максимальное значение в массиве. Но в шаблоне класса тип данных должен быть неопределенным, поэтому позже я мог использовать его с любым - int/char и т.д. в main().
Я пробовал несколько способов инициализировать массив, однако он все еще не работает. Теперь вот одна часть для помещения значений в массив и вторая для печати().
#include <iostream>
#include <cstdlib>
using namespace std;
template <typename T>
class Array {
private:
T **ptr;
public:
Array(T arr[7][12]);
void print();
};
template <typename T>
Array<T>::Array(T arr[7][12]) {
ptr = new T[7][12];
for(int i = 0; i < 7; i++) {
for (int j=0;j<12;j++) {
arr[i][j]=rand()%26+65;
ptr[i][j]=arr[i][j];
}
}
}
template <typename T>
void Array<T>::print() {
for(int i = 0; i < 7; i++) {
for (int j=0; j<12; j++) {
cout<<*(ptr+j)<<" ";
}
cout<<"\n";
}
cout<<endl;
}
int main() {
int arr[7][12];
Array<int> a(arr[7][12]);
a.print();
return 0;
}
В Array<int> a(arr[7][12]);
вы передаете int
из массива arr
, а не всего массива. Кроме того, это целое число выходит за рамки массива, поэтому оно приведет к UB.
Если ваш массив должен быть жестко закодирован до размера [7][12]
, почему вы используете new T[7][12]
? Просто измените T **ptr
на T ptr[7][12];
и пропустите new[]
и delete[]
.
Если размеры известны во время компиляции и вы можете использовать std::array
, вам не нужно динамически выделять массив:
#include <array>
template <typename T,unsigned M,unsigned N>
struct my_2d_array {
using row_type = std::array<T,N>;
std::array< row_type, M> data;
};
Если вы не можете использовать std::array
по каким-либо причинам:
template <typename T,unsigned M,unsigned N>
struct my_2d_array {
T data[M][N];
};
Здесь
int arr[7][12]; Array<int> a(arr[7][12]);
вы объявляете arr
размером 7x12
, а затем получаете к нему доступ из границ. Последний допустимый элемент — это arr[6][11]
, а arr[i][j]
— это один элемент (int
) из массива.
Я думаю, что это то, что вы хотите
#include <iostream>
#include <cstdlib>
using namespace std;
template <typename T>
class Array {
private:
T **ptr;
public:
Array(T arr[][12]);
void print();
};
template <typename T>
Array<T>::Array(T arr[][12]) {
ptr = new T *[7];
for(int i = 0; i < 7; i++) {
ptr[i] = new T[12];
for (int j=0;j<12;j++) {
arr[i][j]=rand()%26+65;
ptr[i][j]=arr[i][j];
}
}
}
template <typename T>
void Array<T>::print() {
for(int i = 0; i < 7; i++) {
for (int j=0; j<12; j++) {
cout<<ptr[i][j]<<" ";
}
cout<<"\n";
}
cout<<endl;
}
int main() {
int arr[7][12];
Array<int> a(arr);
a.print();
return 0;
}
Вот способы, которыми вы можете передать 2D-массив Передача 2D-массива в функцию C++
«Все равно не работает». это не описание проблемы.