2015-04-19 30 views
1

這裏MyLineShape對象b通過引用傳遞給此函數(在MyCustomWidget類中):和myShapeShapes指針。複製引用的對象和調用虛擬方法C++

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

它的工作,即它調用myShapes setPoint1()方法。但是當我嘗試使用這個MyCustomWidget類的其他部分時

myShape->setPoint1(); 

該程序崩潰。也許這是因爲範圍? setPoint1()是一個虛擬函數,因爲不同的形狀類分別實現它。所以我想要做的是在setDrawingObject函數中告訴它從引用接收到哪個對象,併爲該類的其他函數調用複製該類型的對象以備後用。怎麼做?

+1

當程序崩潰時,你會得到什麼樣的錯誤信息?你能告訴我們你的程序崩潰的功能嗎?這將有助於很多。 – Cubia

+0

請在shapeClasses分支上查看:github.com/adolescent/WaterPaint.git。要查看的文件是mainwindow.cpp和MyCustomWiget.cpp – ruben

+0

你說過「但是當在MyCustomWidget類的其他部分」時。你的代碼的哪部分崩潰?請詳細說明你的解釋。 – Cubia

回答

2

這聽起來像你只是有一個懸掛指針。無論您打電話給什麼對象setDrawingObject都會被破壞,而您仍然有指向它的指針。解決這個問題有兩種常用的方法。首先,只要使用shared_ptr

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

第二是到virtualclone()成員函數添加到Shapes,你會都在這裏進行復制。因此,像:

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

無論哪種方式,避免myShape僅僅是一個Shapes*

+0

@eagleye ['reset'](http://en.cppreference.com/w/cpp/memory/unique_ptr/reset)時,@Cubia在mousevent方法中。不,我沒有爲你調試整個項目。如果你想提出另一個問題,請提出另一個問題。 – Barry

+0

不是我認爲它會更容易理解。我會嘗試更多並讓你知道 – ruben

+0

傳遞一個動態分配的指針對象解決了它 – ruben

相關問題