c++表达式必须具有指针到对象的类型

C++ Expression must have pointer-to-object type

本文关键字:对象 类型 指针 表达式 c++      更新时间:2023-10-16

亲爱的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");
}

你的意思可能是:

c_info[i].hoursWorked;

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

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

c_info是一个指向Employee的指针。您可以将单个已分配对象分配给这样的指针,也可以将多个对象分配给这样的指针(使用数组语法的new)。所以它指向一个Employees数组。

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

您可能想要访问i的成员变量——您分配的数组的第一个条目。因此必须反过来:首先使用数组下标操作符,然后访问特定Employee上的成员。

c_info[i]在低级语言中意味着:取指针c_info,将i乘以它所指向的类型的大小(因此它指向i - entry),并对该地址解引用。这意味着,c_info[i]实际上是i -th索引处的Employee(但不是指针)。

那么您想要访问该员工的成员。如果它仍然是指针,则必须使用箭头操作符,但由于使用了数组下标操作符([i]),因此已经对其进行了解引用,因此点操作符是正确的:

cin >> c_info[i].hoursWorked;