2013-04-18 42 views
4

亲爱的计算器有益社会,C++表达式必须具有指针到对象类型

这是使用与结构的指针我的第一个程序,尽管大量的研究,我是不是能找到什么,我一直在寻找因为,但请原谅我,如果这已经回应。

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

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"); 
} 
+0

注你的程序有内存泄漏:你用'new'运算符分配两个数组,但是你不用'delete'运算符来再次释放内存。插入'delete [] c_info;删除[] o_info;'当你不再需要它时。 – leemes

回答

6

你大概的意思是:

c_info[i].hoursWorked; 

因为c_info是一个数组,这样做c_info[i]你访问Employee类的i个实例(对象)中c_info数组,然后获得hoursWorked.运算符。

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

+1

但是c_info是一个指向仅仅一个'Employee'的指针,只是在前几行用'new'实例化。所以这将编译,但我不认为这是正确的答案呢。 –

+0

啊,你是对的。 +1。 –

+0

非常感谢你们俩。这很快:)一切正常! – Larry

2
c_info

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

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

你大概意思来访问您分配的数组的第i项的成员变量。所以你必须要这样做:首先使用数组下标运算符,然后访问该特定员工的成员。

c_info[i]在低级别的词语是指:以指针c_info,添加它指向(所以它指向i个条目)和解除引用该地址的类型的大小i倍。这意味着,c_info[i]实际上是第i号索引处的员工(但不是指针)。

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

cin >> c_info[i].hoursWorked; 
+0

哦,我现在明白了,很好的解释。非常感谢你。 – Larry

+0

尝试使用像'std :: vector'这样的动态数据结构,除非由于学校分配要求而必须使用原始指针/数组。在高水平的C++世界中,它或多或少已经过时(有时仍然被使用)。 'std :: vector'更方便,同样也关于内存管理问题(你不能简单地忘记释放内存)。 – leemes

+0

感谢您的建议,但我确实必须为此作业使用指针,但会尝试自行制作矢量版本。谢谢 ! – Larry

相关问题