2016-05-06 4 views
0

これは悪いスタイル(コンストラクタ外のヘッダで新しく行う)と考えられますか?コンストラクタにないヘッダファイルにメモリを割り当てます。

class ClassName : public QWidget 
{ 
    Q_OBJECT 
public: 
    explicit ClassName(QWidget* parent = 0); 

    CustomList<Identifier*>*const identifier_list = new CustomList<Identifier*>("someString"); 

}; 

私がこれで達成したいのは、どこにでもif (identifier_list == NULL)を書く必要がないということです。このように、identifier_listはNULLにすることはできません。

+3

なぜあなたも、ポインタを使用していますか? 'CustomList identifier_list;'はあなたに存在することが保証された自動オブジェクトを与えます。 – NathanOliver

+0

ヒープを使用したい –

+2

なぜですか? 'CustomList'はそれほど大きなオブジェクトではありません。 – NathanOliver

答えて

0

これはもちろん、デフォルトのメンバーイニシャライザのためにC++ 11以上でのみ動作します。しかし、これを書いて、あなたはnow required to provide (or =delete) your copy/move constructors and assignment operatorsです。このメモリを削除するデストラクタはもちろんですが、

つまり、どのようなコピー動作をしたいのかを決める必要があります。まったくコピーを許可しますか?そうでない場合は、それを示すのに=deleteを使用する必要がありますか?もしそうなら、コピーは何をすべきですか?それはポインタconstなので、ポインタ自体をコピーすることはできません。少なくとも、コピー代入の場合ではありません。したがって、コピーする場合は、ポイント先のオブジェクトをコピーする必要があります。

あなたのポインタconstのおかげで、移動は不可能です(const_castなし)。したがって、あなたの移動コンストラクタ/代入は、単にポインタではなくCustomList<Identifier*>オブジェクトを移動する必要があります。

また、これらのすべてのユーザー定義操作のため、ClassNameは、もはやコピー可能なタイプとはみなされません。リンクされたリストを格納していることを前提としていますが、おそらくいずれかの方法で自明にコピーすることはできません。

これは悪いスタイルと考えられますか?すべてのものが平等である、はい。あなたが動的割り当てを使用するには、本物の、よく考えられた理由がない限り、それは良いでしょうし、最終的にははるかに安全なプログラミングスタイルはそれ値ではなくポインタ作るために:

CustomList<Identifier*> identifier_list("someString"); 
+0

本当にそれをポインタにしたいのであれば、少なくとも 'std :: unique_ptr'のようなスマートポインタラッパーを使用してください。 –

+0

私たちは私たちのプロジェクトで新しいオブジェクトを作成することを決めました。なぜなら、ヒープ上に作成されていないオブジェクトにあまりにも多くのデータがあると、友人がそうしないと教えてくれたからです。 –

+1

@Ini: "新しいもので作成されていないオブジェクトに多すぎるデータがあると、プログラマーがクラッシュする可能性があります。 –