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()