【问题标题】:Can't access vector class members无法访问向量类成员
【发布时间】:2012-12-21 05:36:45
【问题描述】:

我有这个代码:

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' 不是类型
  • 在“.”之前请求非聚合类型的成员令牌

我不知道出了什么问题。

【问题讨论】:

  • 不要在 C++ 中 typedef 类。
  • 也许您需要将代码缩进一点...
  • 如果结构也将在 C 中使用,那么 typedef 就可以了,就像使用 char* 一样,尽管您必须小心“3 规则”(您不能在struct 如果它也将在 C 中使用)。 (假设这不是真正的代码,它真的在一个没有 C++ 的单独头文件中)。

标签: c++ vector std dev-c++


【解决方案1】:
  1. this.data 错误,必须是 datathis-&gt;data

  2. dataiteminfo 的向量,tempiteminfo * 即指针。您无需在此处使用new,您只需在“堆栈上”创建项目,然后使用push_back 将其副本插入到您的向量中。

  3. 因为这很可能根本不是 C,所以不需要 typedef,但更需要使用 std::string 而不是 char * 的字符串。维护这些指针会很麻烦。

  4. 最好不要同时使用item 作为类型和成员。这是合法的,但会在您的代码中混淆。

  5. 理想情况下,将 data 设为 CItem 的私有成员(顺便说一下,如果您使用类名 itemCItem 只是为了重现您的问题,这很好,但在实际代码中它们是糟糕的类名称,请选择更具描述性的名称)。

【讨论】:

  • 如果 OP 的代码为每个错误付费,那将是真正的摇钱树。 BDMCH
  • 太好了,不过我还是在虚拟机访问的接口下使用这个类。一个小问题:我并没有真正使用 iteminfo 作为向量的模板。而不是这个,我使用一个空指针,我可能会转换这个内存地址。我这样做有什么大错误吗?
  • 我认为您的意思是 void * 不是空指针?我想说你可能不想尝试优化向量,但如果你的目标是生成更少的代码,你可以实例化你的模板。
【解决方案2】:

this.data 应该是this-&gt;data,因为this 在 C++ 中是一个指针。

【讨论】:

  • 只是他的错误之一。他的代码中还有一个明显的错误,以及他做错的其他事情。
【解决方案3】:

CashCow 对错误进行了很好的分析。另外我想指出

  • push应该带一个类型iteminfo,参数列表乱七八糟

  • iteminfo 应该有一个构造函数

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

    还考虑将成员设为私有以保护他们免受全球滥用

如果您的代码示例完整,您会发现 CItem 类已过时,可能会被 std::vector&lt;iteminfo&gt;(或 typedef)替换

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    相关资源
    最近更新 更多