0

次の問題: 抽象クラスから派生したオブジェクトへのポインターを返す関数を作成したいと考えています。割り当てエラーが発生したため、関数が終了するとメモリが解放されると思います。しかし、クラスは抽象的であるため、オブジェクトを返すことはできません。関数で、オブジェクトが持つ派生クラスを決定します。どうすれば問題を解決できますか? 何か案が?

QgsSymbolV2* QGISFunc::ReadClassSymbolsXML(QString FeatureType, QXmlStreamReader &reader)
    {
        QgsMarkerSymbolV2* p_mlmSymbol=0;
        try
        {
            QgsLineSymbolV2 mllSymbol;
            QgsFillSymbolV2 mlfSymbol;
            QgsMarkerSymbolV2 mlmSymbol;
...
return &mlmSymbol; // alloc error
4

2 に答える 2

2

自動ストレージを使用して変数のアドレスを返しています。そのオブジェクトは、関数が戻るときに破棄されます。解決策は、オブジェクトをヒープに割り当てることです。その目的のためにスマートポインター(unique_ptrまたはshared_ptrと組み合わせて)を使用し、スマートポインターを返すことをお勧めします。make_shared<>()

std::shared_ptr<QgsSymbolV2> QGISFunc::ReadClassSymbolsXML(
    QString FeatureType, 
    QXmlStreamReader &reader
    )
{
    try
    {
        ...
        std::shared_ptr<QgsSymbolV2> spObj = make_shared<QgsMarkerSymbolV2>();
        ...
        return spObj;
    }
    ...
}
于 2013-01-17T19:40:25.427 に答える
1

あなたの問題は、クラスが抽象的であることとは何の関係もありません。スタック上にオブジェクトを作成してから、そのアドレスを返します。ただし、そのアドレスは、関数が戻った後は無効になります。本当にポインタを返し、所有権を呼び出し元に委任したい場合は、ヒープ上にポインタを作成してみませんnewか?delete後でそのオブジェクトを使い終わったときに忘れないでください。または、@AndyProwlが示唆するようにスマートポインタを検討してください。

于 2013-01-17T19:44:35.730 に答える