在我的C ++代码中,我有一个指向Light对象的指针向量。 P_Light是Light的子类,并且具有字段位置。对于指向实际为P_Light的Light的每个指针,我需要对位置字段执行某些操作。我做了一些搜索,似乎我可以实现一个虚方法,但我不需要Light中的方法,因为其他类型的Light没有位置。我也考虑过施法,但我不确定如何做到这一点。
std::vector<Vector> light_dirs;
for(int i=0; i<lights.size; i++){
Light *l = lights[i];
//cast here?
}
EDIT :: 看到一个不同的帖子,可能使用qobject_cast将是一个好主意。这看起来更好吗?
std::vector<Vector> light_dirs;
for(int i=0; i<lights.size; i++){
Light *l = lights[i];
P_Light* pl = qobject_cast<P_Light*>(l);
if(pl != nullptr) //dostuff;
}
答案 0 :(得分:1)
这应该有用。
P_Light* p_light = dynamic_cast<P_Light*>(l);
上的RTTI和动态广告
答案 1 :(得分:1)
正如Seo所指出的,动态演员可能是快速适应你所描述的用例而不重构类结构的最直接方式。
作为替代方案,您可以考虑使用访问者模式的实现,该模式提供编译时安全性和验证。
'use strict';
var React = require('react-native');
var {
AppRegistry,
StyleSheet,
Text,
View,
TouchableHighlight
} = React;
var index = 0
var SampleApp = React.createClass({
getInitialState(){
return { myArr: [] }
},
_onPressOut() {
let temp = index ++
this.state.myArr.push(temp)
this.setState({
myArr: this.state.myArr
})
},
render() {
let Arr = this.state.myArr.map((a, i) => {
return <View key={i} style={{ height:40, borderBottomWidth:2, borderBottomColor: '#ededed' }}><Text>{ a }</Text></View>
})
return (
<View style={styles.container}>
<Text>First</Text>
{ Arr }
<Text>Second</Text>
<TouchableHighlight style={ styles.button } onPress={ () => this._onPressOut() }>
<Text>Push</Text>
</TouchableHighlight>
</View>
);
}
});
var styles = StyleSheet.create({
container: {
flex: 1,
marginTop:60
},
button: {
height:60,
backgroundColor: '#ededed',
marginTop:10,
justifyContent: 'center',
alignItems: 'center'
}
});
AppRegistry.registerComponent('SampleApp', () => SampleApp);
这为您提供了与动态强制转换相同的优势 - 您的类保持独立于对其进行操作的算法 - 但调度逻辑是集中的,而不是分散在整个源中。
有关访客模式的详细信息,请参阅此article。