复制引用的对象并调用虚方法 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*

【讨论】:

@eagleye reset。不,我不是在为你调试你的整个项目。如果您想问另一个问题,请再问一个问题。 并不是我认为你会更容易理解。我会尝试更多,让你知道

以上是关于复制引用的对象并调用虚方法 C++的主要内容,如果未能解决你的问题,请参考以下文章

深入C++对象模型&虚函数表

C++:多态公有继承中的虚方法

vc 父类实现一个虚函数,子类继承并也实现这个虚函数,子类调用这个虚函数,父类这个虚函数会不会执行?

虚函数 C++ 中的默认参数

尝试在空对象引用上调用虚方法 - 如何正确更改TextView的值

[ C++ ] 抽象类 虚函数 虚函数表 -- C++多态