gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:54:12 25 4
gpt4 key购买 nike

这里 MyLineShape 对象 b 通过引用传递给这个函数(在 MyCustomWidget 类中):和 myShape是一个 Shapes 指针。

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

它有效,即它调用 myShapes setPoint1() 方法。但是在这个 MyCustomWidget 类的其他部分我尝试使用

myShape->setPoint1();

程序崩溃了。也许这是因为范围? setPoint1() 是一个虚函数,不同的形状类分别实现它。所以我想做的是在 setDrawingObject 函数中判断它从引用中接收到哪个对象,并制作该类型对象的拷贝以供以后在此类的其他函数调用中使用。如何做到这一点?

最佳答案

听起来您只是有一个悬挂指针。无论您调用 setDrawingObject 什么对象都会被销毁,而您仍然有一个指向它的指针。有两种常见的方法来解决这个问题。首先,只需使用 shared_ptr:

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

第二个是向 Shapes 添加一个 virtual clone() 成员函数,您将在这里创建一个拷贝。所以像这样:

void MyCustomWidget::setDrawingObject(Shapes& b) {
myShape.reset(b.clone()); // myShape is a unique_ptr<Shapes>
myShape->setPoine1();
}

无论哪种方式,避免让 myShape 只是一个 Shapes*

关于c++ - 复制引用对象并调用虚方法 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29725652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com