Здравствуйте! Есть следующая проблема. Есть класс Упражнение_1 для домашней работы, в котором должны быть функции создания и инициализации динамического массива. Функции из описания класса:
public:
int Exercise_1:: createArray()
{
int size_of_new_arr;
cout << " Enter the size of the array: ";
cin >> size_of_new_arr;
array_ptr = new int[size_of_new_arr];
return size_of_new_arr;
}
void Exercise_1::initializeArray(int* arrFI, int size)
{
for (int i = 0; i < size; i++)
{
*(arrFI + i) = rand() % 100;
}
}
Указатель и переменная в заголовочном файле:
public:
int* array_ptr;
int array_size;
В таком виде все работает нормально, Упражнение_1 корректно отрабатывает. Но если я переписываю первую функцию в следующем виде, то есть принимающую указатель из заголовочного файла как аргумент
public:
int Exercise_1:: createArray(int* arrForCreate) // << Принимает указатель
{
int size_of_new_arr;
cout << " Enter the size of the array: ";
cin >> size_of_new_arr;
arrForCreate = new int[size_of_new_arr]; // << Выделяет память
// Дальше ничего не меняется
return size_of_new_arr;
}
void Exercise_1::initializeArray(int* arrFI, int size)
{
for (int i = 0; i < size; i++)
{
*(arrFI + i) = rand() % 100;
}
}
и потом вызываю ее
Exercise_1 exercise_1;
exercise_1.array_size = exercise_1.createArray(exercise_1.array_ptr); // Создаю массив
exercise_1.initializeArray(exercise_1.array_ptr, exercise_1.array_size);
то я получаю ошибку
Exception thrown: write access violation.
arrFI was 0x1110112.
Помогите разобраться что к чему. Вроде же я кардинально ничего не меняю, пытаюсь инициализировать по сути один и тот же указатель. Я хочу использовать эти функции в другом классе для создания и инициализации другого динамического массива, поэтому нужно, чтобы функция принимала указатель как параметр. Заранее спасибо!
П.С. Стаж С++ около 2.5 месяца, я в самом начале пути и пока очень мало знаю, учитывайте это при ответах
Обычная стандартная ошибка.
int Exercise_1:: createArray(int* arrForCreate) // << Принимает указатель
{
...
arrForCreate = new int[size_of_new_arr]; // << Выделяет память
}
Итак, вы изменили arrForCreate
- локальную копию указателя, переданного в функцию-член. Указатель-оригинал от этого не изменился...
Передавайте его как ссылку:
int Exercise_1:: createArray(int* &arrForCreate)
И еще... Эти ваши функции - они для чего предназначены? чтобы работать с данными объекта? тогда зачем передавать их как параметры?
exercise_1.array_size = exercise_1.createArray(exercise_1.array_ptr);
Ваш createArray()
должен работать со своими данными-членами:
void Exercise_1::createArray()
{
cout << " Enter the size of the array: ";
cin >> array_size;
delete[] array_ptr;
array_ptr = new int[array_size];
}
И вызываться просто и незатейливо:
exercise_1.createArray();
Естественно, в конструкторе array_ptr
должен быть корректно инициализирован.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Предположим, что у меня есть приложение, которое хранит информацию об объектах моего городаУ меня есть MainActivity, которая содержит в себе HomeFragment,...