我有一个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;
}
也欢迎更好的方式。
答案 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>>
。