C/C++

Из метода класса не получается вернуть массив

при нажатии кнопки
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {

const int row = Convert::ToInt32(textBox1->Text);

const int col = Convert::ToInt32(textBox2->Text);

int** A;

A = new int* [row];

for (int i = 0; i < row; i++) {

A[i] = new int[col];

}

Matrix matrix(row, col);


if (comboBox1->Text == "Заполнить матрицу") {

A=matrix.completion(); // заполянется большими. отриц числами

MessageBox::Show("ГОТОВО!");

}


if (comboBox1->Text == "Вывести матрицу") {

for (int i = 0; i < row; i++) {

for (int j = 0; j < col; j++) {

label3->Text = label3->Text + A[i][j] + " ";

if (j == col - 1) label3->Text = label3->Text + "\n";

}

}

label3->Visible = true;

}

}




сама функция в классе
class Matrix {

private:

int** matrix;

int col, row;

public:

Matrix(const int row, const int col) { // инициализация объекта

this->row = row;

this->col = col;

matrix = new int* [row];

for (int i = 0; i < row; i++) {

this->matrix[i] = new int[col];

}

}




~Matrix() { //декструктор

for (int i = 0; i < this->row; i++) {

delete[] this->matrix[i];

}

delete[] this->matrix;

}


int** completion() { // заполнение матрицы

srand(time(NULL));

for (int i = 0; i < this->row; i++) {

for (int j = 0; j < this->col; j++) {

this->matrix[i][ j] = rand() % 100 + 1;



}

}

return matrix;

}

};
Может такой вариант подойдёт?
#include <iostream>
#include <iomanip>
using namespace std;
class Matrix {
public:
Matrix() : row(0), col(0), matrix(nullptr) {}
Matrix(const size_t rows, const size_t cols)
: row(rows), col(cols), matrix(new int*[rows]) {
for (size_t i = 0; i < rows; ++i) {
matrix[i] = new int[cols];
}
}
Matrix(const Matrix& mx)
: row(mx.row), col(mx.col), matrix(new int* [row]) {
for (size_t i = 0; i < row; ++i) {
matrix[i] = new int[col];
matrix[i] = mx.matrix[i];
}
}
Matrix& operator=(const Matrix& mx) {
if (&mx != this) {
row = mx.row;
col = mx.col;
for (size_t i = 0; i < row; ++i) {
matrix[i] = mx.matrix[i];
}
}
return *this;
}
~Matrix() {
if (matrix != nullptr) {
for (size_t i = 0; i < row; ++i) {
delete[] matrix[i];
}
delete[] matrix;
matrix = nullptr;
}
}
int*& operator[](const int i)const {
return matrix[i];
}
size_t rows()const {
return row;
}
size_t columns()const {
return col;
}
void show(const streamsize w)const {
for (auto i = 0U; i < row; ++i) {
for (auto j = 0U; j < col; ++j) {
cout << setw(w) << matrix[i][j];
}
puts("");
}
puts("");
}
private:
size_t row, col;
int** matrix;
};
int main() {
Matrix matrix(2, 3);
int n = 0;
for (auto i = 0U; i < matrix.rows(); ++i) {
for (auto j = 0U; j < matrix.columns(); ++j) {
matrix[i][j] = ++n;
}
}
matrix.show(3U);
system("pause > nul");
}
Александр Салмин
Александр Салмин
79 673
Лучший ответ
Юрий Троцкий Я не могу выводить в классе, так как вывожу в граф. среде. Мне поэтому и надо получить массив из Matrix::completion().
Юрий Троцкий все равно не работает
Юрий Троцкий std::string s;
System::String^ str;
if (comboBox1->Text == "Вывести матрицу") {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
s = std::to_string(A[i][i]);
str = gcnew System::String(s.c_str());
label3->Text = label3->Text + str + " ";
if (j == col - 1) label3->Text = label3->Text + "\n";
}
}
label3->Visible = true;
}
Юрий Троцкий Пишет: ссылка на объект не указывает на экземпляр объекта, ъотя в отладчике ошибок нет
Юрий Троцкий ту же ошибку выводит
Юрий Троцкий ошибка здесь s += std::to_string(A[i][j]) + " ";
Юрий Троцкий Может это из-за того, что массив A не может прочитать matrix.completion()
Ебстественно не вернёшь,
массив приватный.

А должен быть по идее
или глобальный, или публичный.
Юрий Троцкий так методы которые в паблик его видят, а я ими пользуюсь
Вы уверены, что проблема в этом? В самом классе я не вижу проблему. В строке
label3->Text = label3->Text + A[i][j] + " ";
Вы складываете переменную A[i][j] целочисленного типа со строкой " ", вам надо преобразовывать A[i][j] в строку, например std::to_string(A[i][j]). Кроме того, Вы выделяете память под массив A, и в некоторых случаях приравниваете указатель **A к указателю на массив внутри класс A=matrix.completion(). Каждый раз когда Вы так делаете, Вы теряете адресс выделенной памяти под A, и происходит утечка памяти. Чтобы это исправить, просто уберите кусок

A = new int* [row];

for (int i = 0; i < row; i++) {

A[i] = new int[col];

}
Юрий Троцкий Даже если не конвертировать в строку, в label выводиться число в виде строки