C ++表达式必须具有指向对象的类型

时间:2013-04-18 19:18:34

标签: c++ pointers struct

亲爱的stackoverflow有帮助的社区,

这是我的第一个使用带结构指针的程序,尽管进行了大量研究,但我无法找到我想要的东西,但如果已经回复,请原谅我。

我有一个学校项目,我必须定义结构,而不是使用指针数组来存储数据。在这个循环中,我得到错误“表达式必须具有指针对象类型”

for (int i = 0; i < nbClerk; i++)
            {
                cout<<"Number of hours: ";
                cin>>c_info->hoursWorked[i];
            }
            break;

这是整个代码。非常感谢你的帮助

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;

//structure defining Employee
struct Employee
{
    int hoursWorked;
    int hourRate;
    double overtime;
    string name;
    int empID;
};

//Function collecting and calculating info
void employeeInfo(int nbOperator, int nbClerk){

    char classOfEmployee;

    Employee *c_info;
    c_info = new (nothrow) Employee[nbClerk];

    Employee *o_info;
    o_info = new (nothrow) Employee[nbOperator];

    cout<<"Select the class of employee (C=Clerk, O=Operator)";
    cin>>classOfEmployee;

    switch (tolower(classOfEmployee))
    {
    case 'c': 
        for (int i = 0; i < nbClerk; i++)
        {
            cout<<"Number of hours: ";
            cin>>c_info->hoursWorked[i];
        }
        break;
    }
}

int main(){
    int nb1,nb2;
    cout<<"Nb Employee and nb of nb of operator: ";
    cin>>nb1>>nb2;
    nbEmployee(nb1, nb2);
    system("pause");
}

2 个答案:

答案 0 :(得分:6)

你可能意味着:

c_info[i].hoursWorked;

由于c_info是一个数组,通过执行c_info[i],您将访问i数组中Employee类的c_info个实例(对象) ,然后通过hoursWorked运算符获取.

现在您可以清楚地看到您的变体根本没有意义,因为hoursWorked只是一个整数类型而不是数组,因此您无法将[]运算符应用于它。

答案 1 :(得分:2)

c_info是指向Employee的指针。您可以将单个已分配的对象分配给此类指针,或者在您的情况下为多个分配对象(new使用数组语法)。所以它指向一系列员工。

你取消引用那个指针。由于它指向(多个)Employees的数组,它也指向第一个条目。然后你访问一个整数成员变量,这仍然是可能的。但是,您尝试在整数值上使用数组下标运算符([]),这是不可能的。

您可能想要访问已分配数组的i条目的成员变量。所以你必须解决这个问题:首先使用数组下标运算符,然后访问该特定Employee上的成员。

低级单词中的

c_info[i]表示:取指针c_info,添加i次指向它所指向类型的大小(因此它指向i - 入口)和解除引用地址。这意味着,c_info[i]实际上是i - 索引处的员工(但不是指针)。

然后您想要访问该员工的成员。如果它仍然是一个指针,你将不得不使用箭头运算符,但由于你使用了数组下标运算符([i]),你已经取消引用它,你的点运算符是正确的:

cin >> c_info[i].hoursWorked;