1

我现在正在处理这种情况,其中我有一个由多个字段组成的消息对象,所以我有一个地图,我在其中加载了 Field 类的对象:

std::map<int,Field*> myMsg;

但是在我的协议中,字段可以将序列作为一种类型,因此我创建了一个从 Field 类继承的 FieldSequence 类,然后将其添加到我的消息中,我这样做了:

FieldSequence* seqFld=new FieldSequence(sequence);
myMsg[seqFld->id]=seqFld;

但后来我需要以原始序列格式检索我的字段,我确定它的 id 属性我将其设置为 0 值。所以我这样做了:

std::map<int,Field*>::iterator it;
for ( it=myMsg.begin() ; it != myMsg.end(); it++ )
{

    cout << "field id => " << (*it).first <<  endl;
    int idprm=((*it).second)->id;
    if(idprm==0)
    {
        FieldSequence* temp=(*it).second;
    }
}

但是由于这种转换,我有错误,所以我可以做些什么来检索我的原始格式,或者一旦我将它添加到我的地图中,因为它是超类格式,它会永远消失吗?

4

2 回答 2

3

您可以使用dynamic_cast并检查结果:

FieldSequence* temp = dynamic_cast<FieldSequence*>(it->second);
if (temp) { 
  // do stuff
}

但通常这表明您应该重新考虑设计。如果您有许多派生类型并且需要全部检查它们,则它不能很好地扩展。当所有派生类型都实现相同的接口并且没有其他方法时,指向基类的指针容器最强大。

于 2012-04-24T15:55:42.597 回答
0

这是很常见的问题。实际问题不是从 Field* 指针中“获取派生类”。真正的问题是您的 Field 类的接口不能正确地表示它所有派生类的行为。一种选择是:

class Field {
public:
     virtual std::string ContentsAsString() const=0;
};

另一个是这样的:

class Field {
public:
    virtual char *Buffer() const=0;
    virtual int BufferSize() const=0;
};
于 2012-04-24T17:48:49.060 回答