C ++动态内存分配与结构中的数组

时间:2013-07-10 17:31:20

标签: c++ arrays memory structure dynamic-data

有类似的问题,但它们都是C语言,而不是C ++,所以我问了一个新问题。

我一直关注C++ tutorial,在完成动态内存,指针和结构部分之后,我试图将它们放在一个示例程序中。

基本上,我试图拥有一个动态分配的结构数组(程序输入“产生”: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;
}

2 个答案:

答案 0 :(得分:1)

我在代码produce *fruit中看到,因此,fruit是指向一个或多个生产对象的指针。这意味着fruit[i]评估为单个实际produce对象。由于它是一个对象,因此要访问其item成员,请使用.符号。如果它是指针,您只能使用->。因此,您需要将fruit[i]->item;更改为fruit[i].item

答案 1 :(得分: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]等...)都是generate类型的对象(不是指向对象的指针)。因此,访问必须使用访问运营商,而不是 - &gt;