【问题标题】:C++ Expression must have pointer-to-object typeC++ 表达式必须具有指向对象的类型
【发布时间】:2013-04-18 19:18:34
【问题描述】:

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

【问题讨论】:

  • 请注意,您的程序存在内存泄漏:您使用new 运算符分配了两个数组,但您没有使用delete 运算符再次释放内存。不再需要时插入delete[] c_info; delete[] o_info;

标签: c++ pointers struct


【解决方案1】:

你的意思可能是:

c_info[i].hoursWorked;

由于c_info是一个数组,通过c_info[i]你将访问c_info数组中Employee类的i-th实例(对象),然后通过@987654328获取hoursWorked @运算符。

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

【讨论】:

  • 但是 c_info 只是一个指向 Employee 的指针,在几行之前用 new 实例化。所以这会编译,但我认为这还不是正确的答案。
  • 非常感谢你们俩。那很快 :) 一切正常!!
【解决方案2】:

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

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

您可能打算访问已分配数组的i-th 条目的成员变量。所以你必须扭转这个局面:首先使用数组下标运算符,然后访问该特定 Employee 上的成员。

c_info[i] 在低级单词中意味着:获取指针c_info,将i 乘以它指向的类型的大小(因此它指向i-th 条目)并取消引用该地址.这意味着,c_info[i] 实际上是 i-th 索引处的 Employee(但不是指针)。

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

cin >> c_info[i].hoursWorked;

【讨论】:

  • 哦,我现在明白了,解释得很好。非常感谢。
  • 尽量使用像std::vector这样的动态数据结构,除非你因为学校作业要求而不得不使用原始指针/数组。在高级 C++ 世界中,它或多或少已经过时(有时仍在使用)。 std::vector 更方便,还涉及内存管理问题(你不能简单地忘记释放内存)。
  • 感谢您的建议,但我确实必须使用指针来完成这项任务,但肯定会尝试自己制作矢量版本。谢谢!
  • 你也可以把它交出来,并建议你的教授也使用向量;)(除非这个指针版本分配只是一个低级练习,这也很重要)
  • 这是一个低水平的练习。它是编程课的介绍。下学期我们开始看到向量 :)
猜你喜欢
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 2012-06-14
相关资源
最近更新 更多