2013-01-07 66 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)来代替