1

NodeとNodeContainerの2つのクラスがあります。

class Node: public QObject
{
    NodeContainer* parent;
}

class NodeContainer : QObject
{
    bool deleteChild(Node*child)
    {
        if(childNodes->remove(child))
        {
            deleteLater(child);
        }
    }

    QList<Node*> childNodes;
}

ノードは親を持つことも持たないこともできます。Nodeクラスの破棄を実装するためのより良い方法は何ですか?

1)親にアクセスし、そこから自分自身を破壊します

destroy()
{
    if(parent !=0)
    {
        parent.deleteChild(this);
    }
    else
    {
        deleteLater(this);
    }
}

2)信号を発し、後で親にそれを破壊させます

destroy()
{
    if(parent !=0)
    {
        //Once the parent receives it, the parent will delete the child.
        emit parentYouHaveToDeleteChild(this);
    }
    else
    {
        deleteLater(this);
    }
}
4

4 に答える 4

1

オブジェクトツリーと所有権

子オブジェクトを自分で削除することもでき、子オブジェクトは親から自分自身を削除します。たとえば、ユーザーがツールバーを削除すると、アプリケーションがQToolBarオブジェクトの1つを削除する可能性があります。その場合、ツールバーのQMainWindow親は変更を検出し、それに応じて画面スペースを再構成します。

NodeとNodeContainerはQObjectから派生します。QObjectには、子を自動的に削除したり、削除された子を親から削除したりするために使用されるparent()関数と組み込みのオブジェクトツリーがすでにあります。車輪の再発明を行う代わりに、既存のメカニズムを利用するだけです。

于 2012-03-01T20:10:18.190 に答える
1

parentYouHaveToDeleteChild信号がスロットに接続されている場合、deleteChild提示した2つの方法に実質的な違いはありません。プログラムは、スロットを呼び出す前にイベントループに戻りません。

2番目のメソッドがシグナル/スロット呼び出しのオーバーヘッドを追加することを除いて。

于 2012-03-01T19:35:32.900 に答える
0

スマートポインタを使用する

class Node: public QObject
{
    std::unique_ptr<Node> parent;
}

親ポインタに割り当てると、破棄時に削除されます。割り当てない場合は、何も起こりません:)

また、リスト内のスマートポインターを使用することもお勧めします。

std::list<std::unique_ptr<node> > node_list;

これはにtypedeffedすることができます

typedef std::unique_ptr<node> node_up_t;
typedef std::list<node_up_t>  node_list_t;

または何かより良い

このように、要素がリストから削除されると、自動的に削除されます。リストが破棄される場合も同様です。

UI以外のコードの場合は、標準のコンテナーを使用することを強くお勧めします。これは、標準のコンテナーであり、ライブラリへの依存を減らすためです。

于 2012-03-01T19:32:30.093 に答える
0

私は1)を行いますが、ノードのデストラクタで、つまり

class Node: public QObject
{
public:
    ~Node ()
    {
        if(parent !=0)
        {
            parent.deleteChild(this);
        }
    }

    NodeContainer* parent;
}

オブジェクトが「自殺」するのは良いOOプラクティスではないと思います。ノードを作成するオブジェクトもそれらを削除する必要があり、デストラクタを介して、それらは潜在的なNodeContainerからも削除されます。

シグナル/スロットもQtペアレント化メカニズムも使用しない場合、オブジェクトをQObjectの子孫にする意味はほとんどないことに注意してください。それは利益なしでオーバーヘッドを追加します。

于 2012-03-02T00:34:40.503 に答える