在c ++中从数组动态转换

时间:2013-10-30 14:28:05

标签: c++ vector casting

我有一个STSequencer课,它扩展了ofxDTanbileBase。 我有一个方法,根据我给出的className返回vector<ofxDTanbileBase>。 我想回到STSequencer,但我得到以下错误:

'ofxDTangibleBase *'不是一个类

从右值到参考类型'STSequencer&amp;'

的Dynamic_cast

这是我尝试atm的方式:

 vector<ofxDTangibleBase> sequencers = gTangibleList->findTangibleByClassName("STSequencer");

for (int i = 0; i < sequencers.size(); i++) {
    STSequencer &sequencer = dynamic_cast<STSequencer&>(&sequencers[i]);

}

这是方法:

vector<ofxDTangibleBase> ofxDGlobalTangibleList::findTangibleByClassName(const char *className) {

    vector<ofxDTangibleBase> returnVector;

    for (int i = 0; i < _tangibles.size(); i++) {
        ofxDTangibleBase &t = _tangibles[i];
        if (t.className == className) {
            returnVector.push_back(t);
        }
    }

    return returnVector;
}

也欢迎更好的方式。

2 个答案:

答案 0 :(得分:0)

STSequencer &sequencer = dynamic_cast<STSequencer&>

应该是

STSequencer *sequencer = dynamic_cast<STSequencer*>

或删除&前面的sequencers[i]。通过获取sequencers[i]的地址,您有一个指针。但是你正在尝试使用dynamic_cast进行引用,这没有意义。

如果您的设计存在其他风险。当你不期望它时,你最终可能会复制(和切片)元素。我不确定你在做什么。对于这个答案,我只是查看了无法编译的行。

答案 1 :(得分:0)

您的向量实际上并不包含STSequencer个对象,因此即使在修复了间接(引用与指针)级别的问题之后,强制转换也会导致未定义的行为。

如果你真的需要多态性,你需要在向量中存储地址,而不是对象,因为向量会对元素的大小做出假设。

尝试std::vector<std::unique_ptr<ofxDTanbileBase>>