2011-08-04 11 views
2

newbieここで、私のC++プロジェクトの問題を整理するために、g ++の-WeffC++オプションでコンパイルしています。初期化リストの質問、std vectorに重点を置いて

それは私についての警告の数百与えている「という警告を...メンバー初期化リストで初期化されなければならない」

が、それはa)はそれらをすべてで書くために少し時間がかかりますと見てこれは本当に必要ですb)変数が必要なときに変数を初期化することがうれしかったときには、ものをもっと厄介にする。

さらに具体的には、std :: vectorをどのように初期化するのですか?

これは方法ですか、つまり角かっこで0を入れますか? マイヘッダ:

class Blade; 
class Postpro { 
    public: 
    Postpro(string fName) : theFileName(fName), 
          blade(NULL), 
          sizes(10), 
          t(std::vector<double>(0){}; 
    ~Postpro(){}; 
    void test(); 

    private: 
    string theFileName; 
    Blade* blade; 
    int sizes; 
    std::vector<double> t; 
} 

そして、私はそれを使用したい場合は、その後のcppに私はベクトルのサイズを変更しますか?

void Postpro::test() { 
    blade = new Blade; 
    t.resize(37); 
} 

おかげ

+0

このリンクのサンプルコードを参照してください。http://www.cplusplus.com/reference/stl/vector/vector/ – yasouser

答えて

1

は、あなたがそれをやったこの方法を行うことができますが、意味がありません - デフォルトコンストラクタはまったく同じ仕事をしていません。初期化子リストを使用する方が良いですが、コードが判読不能または不必要に複雑になる場合は、コンストラクタ本体のメンバ変数を初期化(より正確にはデフォルト値からリセット)しても問題ありません。

+2

コンストラクタ本体でメンバーを**初期化することはできません。 – UncleBens

+0

@UncleBensもちろんデフォルト値からリセットすることを意味します;-) –

+0

ありがとうございました。私は今すぐ取得します – CptLightning

2

ゼロかもしれないベクトルの有効な値であるが、私はそれを見たことがない。

ベクターにはデフォルトのコンストラクタがあるので、実際には値を与える必要はありません。ただt()となります。

警告は警告に過ぎず、ベクトルのデフォルトのコンストラクタはとにかく呼び出されます。

あなたはあまり入力したので、それは多くの時間を入力することになりません
+1

'std :: vector'を整数で初期化すると、ベクトルを割り当てる' std :: vector'コンストラクタが呼び出されます一定の大きさである。 –

+1

@Frerich - 私は 'std :: string(0)'が0をヌルポインタとして扱い、クラッシュすることを知っているので少し慎重です。ベクタはより良く動作するかもしれませんが、私はチェックする気はしませんでした。 :-) –

+0

私はベクトルに 'const CharT *'を受け入れるコンストラクタがないと思っています:) – UncleBens

3

代わりの

t(std::vector<double>(0)) 

をあなたが同じでなければなりません

t(0) 

を書くことができ

t() 

警告が少し太っているかもしれません。デフォルトコンストラクタを持つクラスは自動的に初期化されます。初期化されていないPODメンバーだけに警告する警告フラグは、より価値があるように見えます(そうしないと、ノイズが大きくなります)。

実際には、デフォルトのコンストラクタを使用してそのメンバを初期化することを意味する読者が表示されることがあります。

関連する問題