复制引用的对象并调用虚方法C ++

时间:2015-04-19 04:03:52

标签: c++ pointers inheritance

此处MyLineShape对象b通过引用传递给此函数(在MyCustomWidget类中):myShapeShapes指针。

void MyCustomWidget::setDrawingObject(Shapes &b){
   myShape = &b;
   myShape->setPoint1();
}

它可以工作,即调用myShapes setPoint1()方法。但是当我在MyCustomWidget类的其他部分尝试使用

myShape->setPoint1();

程序崩溃了。也许这是因为范围? setPoint1()是一个虚函数,因为不同的形状类分别实现它。所以我想要做的是在setDrawingObject函数中告诉它从引用中接收了哪个对象,并复制该类型的对象以供以后在该类的其他函数调用中使用。怎么做?

1 个答案:

答案 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*