Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Почему я не могу использовать массив в классе?

Сергей Федоров Ученик (103), закрыт 2 недели назад
 #include 

class myClass {
private:
int sizeX, sizeY;
int** field;
public:
myClass() {
int** field = new int* [sizeY];
for (int i = 0; i < sizeY; i++) {
field[i] = new int[sizeX];
}

for (int i = 0; i < sizeY; i++) {
for (int j = 0; j < sizeX; j++) {
field[i][j] = 0;
}
}
}

void func() {
std::cout << field[1][1];
}
}

int main() {
myClass myclass;
myclass.func();
return 0;
}

При вызове функции func выдается ошибка о нарушении прав доступа. Как это можно исправить? Я пробовал гуглить, но так ничего и не понял
Дополнен 3 месяца назад
myClass(){
sizeX = 3;
sizeY = 3;
}

забыл дописать
Лучший ответ
Андрей Высший разум (427808) 3 месяца назад
Потому, что ты НЕ инициализируешь поля sizeX и sizeY и там содержится какой-то мусор.
Потому, что ты инициализируешь не поле field, а локальную переменную field. А в поле field остаётся какой-то мусор.
 myClass(int rows, int cols) {
sizeY = rows;
sizeX = cols;
field = new int* [sizeY];
for (int i = 0; i < sizeY; i++) {
field[i] = new int[sizeX];
}

for (int i = 0; i < sizeY; i++) {
for (int j = 0; j < sizeX; j++) {
field[i][j] = 0;
}
}
}
 myClass myclass(3, 5); // создание массива размером 3*5 
Сергей ФедоровУченик (103) 3 месяца назад
Спасибо, но у меня в коде записано. Я сюда не очень правильно переписал.
 #include  

class myClass {
private:
int sizeX, sizeY;
int** field;
public:
myClass() {
sizeX = 3;
sizeY = 3;
int** field = new int* [sizeY];
for (int i = 0; i < sizeY; i++) {
field[i] = new int[sizeX];
}

for (int i = 0; i < sizeY; i++) {
for (int j = 0; j < sizeX; j++) {
field[i][j] = 0;
}
}
}

void func() {
std::cout << field[1][1];
}
}

int main() {
myClass myclass;
myclass.func();
return 0;
}
Сергей ФедоровУченик (103) 3 месяца назад
так что проблема все еще не решена
Андрей Высший разум (427808) Сергей Федоров, Поправил основной ответ. Ты же внутри конструктора создаёшь локальную переменную field и инициализируешь эту локальную переменную, а не полу класса.
Остальные ответы
Николай Веселуха Высший разум (360971) 3 месяца назад
 #include  
#include
#include

using namespace std;

class IntMatrix {
size_t rows;
size_t columns;
int** matrix;
public:
IntMatrix()
: rows(0), columns(0), matrix(nullptr) {}
~IntMatrix() {
if (matrix != nullptr) {
for (size_t i = 0; i < rows; ++i) delete[] matrix[i];
delete[] matrix;
matrix = nullptr;
rows = columns = 0;
}
}
bool create(const size_t rows, const size_t columns, int value = 0) {
auto tmp = new(nothrow) int*[rows];
if (!tmp) return false;
for (size_t i = 0; i < rows; ++i) {
tmp[i] = new(nothrow) int[columns];
if (!tmp[i]) {
for (size_t j = 0; j < i; ++j) delete[] tmp[j];
delete[] tmp;
tmp = nullptr;
return false;
} else {
for (size_t j = 0; j < columns; ++j) tmp[i][j] = value;
}
}
this->~IntMatrix();
matrix = move(tmp);
this->rows = rows;
this->columns = columns;
tmp = nullptr;
return true;
}
void fill_random(int a, int b) {
if (!matrix) return;
if (a > b) swap(a, b);
uniform_int_distribution<> uid(a, b);
mt19937 gen{ random_device()() };
for (size_t i = 0; i < rows; ++i) {
for (size_t j = 0; j < columns; ++j) {
matrix[i][j] = uid(gen);
}
}
}
void show(const streamsize width = 0) const {
if (!matrix) return;
for (size_t i = 0; i < rows; ++i) {
for (size_t j = 0; j < columns; ++j) {
cout << setw(width) << matrix[i][j] << ' ';
}
cout.put('\n');
}
}
};

int main() {
IntMatrix im;
if (im.create(4, 5)) {
im.show();
cout.put('\n');
}
if (im.create(3, 6)) {
im.fill_random(10, 99);
im.show(4);
}
}
Анонимус Мыслитель (9278) 3 месяца назад
myClass() {
field = new int* [sizeY];
for (int i = 0; i < sizeY; i++) {
field[i] = new int[sizeX];
}

for (int i = 0; i < sizeY; i++) {
for (int j = 0; j < sizeX; j++) {
field[i][j] = 0;
}
}
}
Похожие вопросы