混乱

2012-01-02 45 views
1

私のコーディングの練習は最高に説明することができます。混乱

  1. ウィジェットは、積極的に(テキストを提供して例えばQLineEditを使用しようとしている場合)、私はヘッダーファイルでそれを宣言し、MainWindow.cppでそれを初期化します。例: TextEditor.h:

class TextEditor { //other code private: QLineEdit edtFind; };

2 ..ウィジェットを使用しない場合(例えばQLabelQWidget)を、またはそれは、信号スロットシステム(例えばのQPushButton)の一部だ、私は宣言し、新しいコンストラクタを使用してそれをinialiseします。

-e.g.

TextEditor::TextEditor() 
{ 
    //other code 
    QWidget* searchPanel = new QWidget(); 
    edtFind = new QLineEdit("Enter Search Term"); 
    QPushButton* findButton = new QPushButton("Find"); 
    connect(findButton,SIGNAL(pressed()),this,SLOT(find())); 

    ui->statusbar->addPermanentWidget(searchPanel); 
} 

私の質問は、ポイント2で効率的なアプローチを使用していますか?ヒープからメモリを割り当てない方が良いでしょうか?

ありがとうございました。

+0

'new'を使用して割り当てられたメモリがヒープに割り当てられます。あなたはすでに2番目の点でそれをやっています。そして、その変数はそのクラスの_property_であるときはいつでもクラスメンバでなければならず、また変数は最も寿命とスコープが狭くなければなりません。 –

答えて

2

あなたのアプローチは効率的ではありません。他の場所で作成されたオブジェクトへの参照を保持しているヘッダファイル

  • を含めないようにするために、前方宣言を使用して長寿命
  • を持って

    • オブジェクトを:あなたが実際にそれらを必要とするときに、ヒープ割り当てられたオブジェクトを使用する必要があります

    あなたのアプローチは、目に見える利益がなくても複雑です。ヒープは遅いことが知られており、多数の小さなオブジェクトを割り当てることは断片化することが知られています(これはアプリケーションに違いはないかもしれませんが、やはり悪いことです)。

  • +0

    非常に明確な点。ありがとう。 –

    1

    C++の一般的なアドバイスは良いですが、Qt:QObject(とQWidgetはQObjectから派生しているため、すべてのウィジェットがあります)では、答え1は実際には間違っています。 QObjectが親ベースのガベージコレクションを備えているため(最上位のQObject-parentが削除された場合、すべての子プロセスに再帰的に自身を削除するように要求するため)、QObjectには親がある場合は常にヒープにQObjectを割り当てます。アプリケーションがスタック上のオブジェクトを削除しようとするとクラッシュする可能性があります。

    Qtのいくつかの操作では、レイアウトにウィジェットを追加するなど、副作用(補完)として暗黙的にQObjectの親を追加または変更することに注意してください。ただし、これは通常、APIドキュメントに記載されています。再作成はQWidgetsで非常に一般的なので、決してそれらをスタックに置くべきではありません。他のQObject派生クラスはより安全です。疑わしい場合はAPIドキュメントを参照してください。