此处MyLineShape
对象b
通过引用传递给此函数(在MyCustomWidget
类中):myShape
是Shapes
指针。
void MyCustomWidget::setDrawingObject(Shapes &b){
myShape = &b;
myShape->setPoint1();
}
它可以工作,即调用myShapes setPoint1()方法。但是当我在MyCustomWidget类的其他部分尝试使用
时myShape->setPoint1();
程序崩溃了。也许这是因为范围? setPoint1()
是一个虚函数,因为不同的形状类分别实现它。所以我想要做的是在setDrawingObject
函数中告诉它从引用中接收了哪个对象,并复制该类型的对象以供以后在该类的其他函数调用中使用。怎么做?
答案 0 :(得分:2)
听起来你只是有一个悬垂的指针。无论你正在调用什么对象setDrawingObject
都会被摧毁,而你仍然指向它。有两种常见的方法可以解决这个问题。首先,只需使用shared_ptr
:
void MyCustomWidget::setDrawingObject(shared_ptr<Shapes> b) {
myShape = b;
myShape->setPoint1();
}
第二种方法是将virtual
clone()
成员函数添加到Shapes
,您可以在此复制。如下所示:
void MyCustomWidget::setDrawingObject(Shapes& b) {
myShape.reset(b.clone()); // myShape is a unique_ptr<Shapes>
myShape->setPoine1();
}
无论哪种方式,请避免让myShape
成为Shapes*
。