Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Eclipse无法从类指针(C+;+;)构成的向量解析方法_C++_Eclipse_C++11 - Fatal编程技术网

C++ Eclipse无法从类指针(C+;+;)构成的向量解析方法

C++ Eclipse无法从类指针(C+;+;)构成的向量解析方法,c++,eclipse,c++11,C++,Eclipse,C++11,我有一个类似这样的类: enum DATA_TYPE {bla, bla2}; class Mem_Data { private: DATA_TYPE m_eType; uint32 m_nLineAddr; uint32 m_nPhysAddr; uint32 m_nSize; int m_nIndex; public: Mem_Data(DATA_TYPE eType, uint32 nLineAddr,uint6

我有一个类似这样的类:

enum DATA_TYPE {bla, bla2};
class Mem_Data
{
private:
    DATA_TYPE m_eType;
    uint32    m_nLineAddr;
    uint32    m_nPhysAddr;
    uint32    m_nSize;
    int       m_nIndex;
public:
    Mem_Data(DATA_TYPE eType, uint32 nLineAddr,uint64 nPhysAddr,uint64 m_nSize, int nIndex = 0);
    DATA_TYPE GetType();
    int GetIndex();
    uint32 GetLineAddr();
    uint32 GetPhysAddr();
};
然后,我创建一个由此类指针构成的向量:

Vector<Mem_Data *> m_dataVec;
m_dataVec.push_back(new MemData());
m_dataVec.push_back(new MemData());
m_dataVec.push_back(new MemData());
上述问题无法解决。 然而,这似乎是可行的:

Mem_Data *p = m_dataVec.front();
p->GetType();
这确实解决了问题,但它似乎不美观,因为它迫使我添加另一个变量,而不是直接访问类实例

如有任何建议,将不胜感激。

返回迭代器

为了访问存储在向量中的数据,或者更具体地说,访问迭代器指向的数据,您需要取消对迭代器的引用

您可以使用
operator*()
operator->()
执行此操作

在您的示例中,您可以按如下方式执行此操作:

auto iterator = m_dataVec.begin(); // get iterator from vector
Mem_Data *p = *iterator;           // dereference iterator to get Mem_Data pointer
您可以使用
*
在一行中取消引用
begin()

*m_dataVec.begin() // this is a Mem_Data pointer
然后,您可以使用
*
->
访问指针指向的数据:

(*m_dataVec.begin())->GetType();
请注意,
(*m_dataVec.begin())
周围的参数是必需的,因为运算符优先

另一种方法是双重解引用,它可以让您访问
Mem\u数据&

**m_dataVec.begin().GetType(); // double deref - 1st the iterator, then the pointer

这就是我最终使用的:

((Mem_Data*)cve.m_dataVec[0])->GetLineAddr()

向量实现似乎一直试图使用consts[]操作符而不是普通的[]操作符,这就解决了这个问题

或者干脆
m_dataVec.front()->GetType()
front
函数返回对第一个存储对象的引用,而不是迭代器。很抱歉,我在发表文章时感到困惑,我确实使用了m_dataVec.front()而不是m_dataVec.begin()。这是个坏主意。你在抛弃康斯特内斯。你应该找出为什么
cve
是const,并修复你的设计,这样你就有了可变的访问权限。此外,作为一般的经验法则,你应该始终将你的代码视为bug的来源,而不是std库。99.99%的情况下,std库是正确的,错误的是您的代码。这里,说“出于某种原因,impl一直试图使用const[]运算符…”,这是出于设计,我敢打赌
cve
是const这是让我困惑的,cve只是一个包含向量的类,它没有任何const。我不明白为什么它试图起诉const Operator更新您的问题以显示您从哪里获得
cve
,然后我们也许可以看到问题所在。此时,编译器告诉您
cve
是常量,这就是为什么您只能访问
操作符[]()
。另外,不要说“eclipse无法解析”,而是发布您得到的实际错误消息,因为这也将帮助我们从您创建的答案中获得帮助。我要说的是,失败是因为您试图从常量向量中的类指针调用非常量成员函数。获取一个非常量向量,就可以调用想要调用的成员函数这是cve:'classCVE{private:public:vector m_dataVec;uint32 m_nCBDone;int EnableInterrupts();}'正如你所看到的,里面没有提到const。
((Mem_Data*)cve.m_dataVec[0])->GetLineAddr()