2013-04-18 43 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

相關問題