2013-01-07 100 views
2

我有這樣的代碼:無法訪問向量類成員

WItem.h

#include <vector> 
#include <string> 

typedef struct iteminfo { 
int rowid; 
    char* item; 
    int type; 
    int extra; 
    int objectid; 
} item; 


class CItem { 
public: 
    void push(int rowid, char* item, int type, int extra, int objectid); 
    std::vector<iteminfo> data; 
}; 

WItem.cpp

#include "witem.h" 

void CItem::push(int rowid, char* item, int type, int extra, int objectid) { 
    iteminfo* temp = new iteminfo; 
    temp->rowid = rowid; 
    temp->item = item; 
    temp->type = type; 
    temp->extra = extra; 
    temp->objectid = objectid; 

    this.data.push_back(temp); 
} 

而且我得到這些錯誤:

  • `data'不是一個類型
  • 在''之前請求非聚合類型的成員。代幣

而且我不知道什麼是錯的。

+2

不要用C不'typedef'類++。 – chris

+0

也許你需要縮進代碼更多... – avakar

+0

如果結構也將在C中使用,那麼typedef是好的,就像使用char *儘管你必須小心「3規則」(它你也不能在結構中重載,如果它將用於C)。 (假設這不是真正的代碼,它確實在沒有C++的單獨頭文件中)。 – CashCow

回答

5
  1. this.data是錯誤的,需要是要麼只是datathis->data

  2. dataiteminfo載體並tempiteminfo *即指針。你不需要在這裏使用new,你應該創建「堆棧」項目,然後使用push_back將它的一個副本插入到你的向量中。

  3. 因爲這可能根本不是C,所以不需要typedef,但是對於不是char *的字符串使用std::string。維護這些指針會導致很多混亂。

  4. 最好不要使用item作爲類型和成員。這是合法的,但會讓你的代碼感到困惑。

  5. 理想的情況下做出dataCItem(順便說一句,如果你使用的是類名itemCItem只是在這裏重現您的問題,這很好,但在真正的代碼,他們是貧困階層的名字,選擇一些更具描述性的)的私有成員。

+0

哇,這是徹底的:)擁有一票 –

+0

如果OP的代碼支付每錯誤的錢,它將是一個真正的搖錢樹。 BDMCH –

+0

這很好,但我仍然在虛擬機訪問的界面下使用這個類。一個小問題:我沒有真正使用iteminfo作爲向量的模板。而不是這個,我使用空指針,我可能會投這個內存地址。我正在用這個做什麼大錯誤? – Stewie

4

this.data應該是this->data,因爲this是C++中的一個指針。

+0

明白了。由壞...謝謝! – Stewie

+0

只是他的一個錯誤。他的代碼中還有一個明顯的錯誤,以及他做錯了的其他事情。 – CashCow

0

CashCow對錯誤做了很好的分析。此外,我想指出

  • 推應採取型iteminfo,參數列表是凌亂

  • iteminfo應該有一個構造

    iteminfo(int rowid, char* item, int type, int extra, int objectid);

    也認爲製作成員私人保護他們免受全球濫用

,如果你的代碼示例是完整的,你認識到,類CItem是過時的,可以通過std::vector<iteminfo>(或一個typedef)來代替