2017-11-08 5 views
-5

ここで何が起こるのか分かりません!クラスcVtstを定義し、ベクトルを作成します。私はオブジェクトが作成され、破壊されるのを見ます。ベクターに空きオブジェクトがないのはなぜですか?とにかく何が起こりますか?

class cVtst { 
public: 
    int v; 
    cVtst(int v) { 
     this->v = v; 
     printf("Creating cVtst %d\n", v); 
    } 
    ~cVtst() { 
     printf("Closing cVtst %d\n", v); 
    } 
}; 

std::vector<cVtst> vc; 
vc.push_back(34); 
vc.push_back(2); 
vc.push_back(-5); 
while (!vc.empty()) vc.pop_back(); 

結果は次のとおりです。だから、

Creating cVtst 34 
Closing cVtst 34 
Creating cVtst 2 
Closing cVtst 34 
Closing cVtst 2 
Creating cVtst -5 
Closing cVtst 34 
Closing cVtst 2 
Closing cVtst -5 
Closing cVtst -5 
Closing cVtst 2 
Closing cVtst 34 

...?

+3

あなたの質問は何ですか? –

+9

コピーに注釈を付けてコンストラクタを移動するのを忘れてしまった。私が期待したものが表示されない理由を – Mat

+0

私の質問は: が作成cVtst 2 を作成cVtst 34 を作成cVtst -5 閉会cVtst -5 閉会cVtst 2 あなたはコピーや移動コンストラクタに注釈を付けるのを忘れているのでcVtst 34 – Ted

答えて

2

クラスにもう少し注釈を付けると、何が起きているのかを明確にする必要があります。

#include <vector> 
#include <cstdio> 

using std::printf; 
using std::vector; 

class cVtst { 
    static int seqCounter; 
    int seq; 
    int v; 
public: 
    cVtst(int v) { 
    this->v = v; 
    this->seq = ++seqCounter; 
    printf("Creating cVtst#%d %d\n", seq, v); 
    } 
    ~cVtst() { 
    printf("Closing cVtst#%d %d\n", seq, v); 
    } 
    cVtst() { 
    this->v = ~0 & (~0U >> 1); 
    this->seq = ++seqCounter; 
    printf("Default Creating cVtst#%d %d\n", seq, v); 
    } 
    cVtst(cVtst const& other) { 
    this->v = other.v; 
    this->seq = ++seqCounter; 
    printf("Copy Creating cVtst#%d %d\n", seq, v); 
    } 
}; 

int cVtst::seqCounter = 0; 

int main() { 
    vector<cVtst> vc; 
    vc.push_back(34); 
    vc.push_back(2); 
    vc.push_back(-5); 
    while (!vc.empty()) vc.pop_back(); 
} 

UPDATE: 何あなたの元の例を考慮していませんが、C++コンパイラはコピーコンストラクタやデフォルトコンストラクタを合成することです。

出力にこれらのコンストラクタが表示されないため、出力の作成と終了のアンバランスなセットが表示されます。 (私はあなたの "だから...?"という質問は "なぜ彼らが出力を作成したり閉じているのが不均衡なのですか?"と思っています)

+1

コードを表示するだけでなく、少しコメントを書く必要があります。 –

+0

はい!ありがとう!私はこれらのコンストラクタの詳細を読む必要があります。私は彼らが存在するのか知らなかった! – Ted

関連する問題