C ++ динамическое распределение памяти с массивами в структуре

Были подобные вопросы, но все они на C, а не на C ++, поэтому я задал новый вопрос.

Я следил за Учебник по С ++ и после завершения динамической памяти, указателей и структурных разделов я попытался соединить их в пример программы.

По сути, я пытаюсь получить динамически распределенный массив структуры (входные данные программы «производят»: P и отображают результат).

Ошибки компилятора: 'base operand of '->' has non-pointer type 'produce' для кода fruit[i]->item;

Извините, если код немного запутан (я не хотел пропускать разделы на случай, если они были проблемой, даже если это приводит к тому, что вопрос «слишком локализован»):

#include <iostream>
#include <string>
#include <new>

using namespace std;

struct produce {
int price;
string item;
};

int main(void) {
int num;
int i;

//Get int for size of array
cout << "Enter the number of fruit to input: ";
cin >> num;
cout << endl;

//Create a dynamically allocated array (size num) from the produce structure
produce *fruit = new (nothrow) produce[num];
if (fruit == 0) {
cout << "Error assigning memory.";
}
else {
//For 'num', input items
for (i = 0; i < num; i++) {
cout << "Enter produce name: ";
//Compiler error: 'base operand of '->' has non-pointer type 'produce'
cin >> fruit[i]->item;
cout << endl;

cout << "Enter produce price: ";
cin >> fruit[i]->price;
cout << endl;

cout << endl;
}
//Display result
for (i = 0; i < num; i++) {
cout << "Item: " << fruit[i]->item << endl;
cout << "Cost: " << fruit[i]->price << endl;
cout << endl;
}
//Delete fruit to free memory
delete[] fruit;
}

return 0;
}

1

Решение

Я вижу в вашем коде produce *fruit, так, fruit указатель на один или несколько производственных объектов. Это означает, что fruit[i] оценивает один фактический produce объект. Поскольку это объект, чтобы получить доступ к его item член, вы используете . условное обозначение. Вы бы использовали только -> если бы это был указатель. Так что вам нужно изменить fruit[i]->item; в fruit[i].item,

1

Другие решения

Рассмотрим этот простой пример, чтобы показать, как вы обращаетесь к объекту, а не указатель на объект:

int *arr = new (std::nothrow) int[10];
for(int i=0; i< 10 ; ++i)
{
arr[i]=i;
}
delete [] arr;

Каждый элемент в arr (например, arr [0]) представляет собой простое int, для примера инициализируется содержимое каждого элемента массива значением индекса, затем массив int удаляется. Например, каждый элемент в массиве fruit (fruit [0], fruit [1] и т. Д.) Является объектом типа product (а не указателем на объект). Поэтому доступ должен быть с оператором доступа . вместо ->.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector