复制引用的对象并调用虚方法 C++
Posted
技术标签:
【中文标题】复制引用的对象并调用虚方法 C++【英文标题】:Copy referenced object and call virtual method C++ 【发布时间】:2015-04-19 04:03:52 【问题描述】:这里MyLineShape
对象b
通过引用传递给这个函数(在MyCustomWidget
类中):并且myShape
是一个Shapes
指针。
void MyCustomWidget::setDrawingObject(Shapes &b)
myShape = &b;
myShape->setPoint1();
它有效,即它调用 myShapes setPoint1() 方法。但是当在这个 MyCustomWidget 类的其他部分我尝试使用
myShape->setPoint1();
程序崩溃。也许这是因为范围? setPoint1()
是一个虚函数,因为不同的形状类分别实现它。所以我要做的是在setDrawingObject
函数中告诉它从引用中接收到哪个对象,并复制该类型的对象以供以后在此类的其他函数调用中使用。该怎么做?
【问题讨论】:
程序崩溃时会收到什么样的错误信息?你能告诉我们你的程序崩溃的功能吗?这会很有帮助。 请看一下:github.com/adolescent/WaterPaint.git on shapeClasses 分支。要查看的文件是 mainwindow.cpp 和 MyCustomWiget.cpp 您说“但是在这个 MyCustomWidget 类的其他部分”。你的代码的哪一部分崩溃了?请详细说明。 你不是在复制引用的对象,你是在获取它的地址。 @Cubia 在我尝试使用 myShape->setPoint1() 时使用 mousevent 方法 【参考方案1】:听起来你只是有一个悬空指针。无论您调用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*
。
【讨论】:
@eagleyereset
。不,我不是在为你调试你的整个项目。如果您想问另一个问题,请再问一个问题。
并不是我认为你会更容易理解。我会尝试更多,让你知道以上是关于复制引用的对象并调用虚方法 C++的主要内容,如果未能解决你的问题,请参考以下文章
vc 父类实现一个虚函数,子类继承并也实现这个虚函数,子类调用这个虚函数,父类这个虚函数会不会执行?