0

我有一个STSequencer扩展类ofxDTanbileBase。我有一个vector<ofxDTanbileBase>基于我给出的类名返回的方法。我想回退,STSequencer但出现以下错误:

'ofxDTangibleBase *' 不是一个类

Dynamic_cast 从右值到引用类型'STSequencer &'

这就是我尝试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;
}

也欢迎更好的方法。

4

2 回答 2

0

STSequencer &sequencer = dynamic_cast<STSequencer&>

应该

STSequencer *sequencer = dynamic_cast<STSequencer*>

否则删除&前面的sequencers[i]. 通过获取 的地址sequencers[i],您有一个指针。但是您随后尝试将 dynamic_cast 转换为引用,这没有意义。

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

于 2013-10-30T14:51:36.753 回答
0

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

如果您确实需要多态性,则需要将地址存储在向量中,而不是对象中,因为向量对其元素的大小做出了假设。

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

于 2013-10-30T15:08:58.247 回答