4

いくつかの静的データを持つクラスを作成しました。このようなもの:

class Object
{
public:
    Object();
    Object( Point center, double area );
    Object( int cx, int cy, double area );
    ~Object();
    //and other public stuffs here...
private:
    Point center;
    double area;
    static double totalArea;
    static int objCounter;
    static double areaMean;
};

私が作成したコンストラクタとデストラクタよりも:

Object::Object()
{
    this->setCenter( Point() );
    this->setArea( 0.0 );
    objCounter++;
    totalArea += 0;
    areaMean = totalArea / objCounter;
}
/*this is just the default constructor I 
have two others that increment real area, not 0*/ 

Object::~Object()
{
    //cout << "Destructor called!\n"; //put it just to test
    objCounter--;
    totalArea -= this->area;
    areaMean = totalArea / objCounter;
}

したがって、私の意図は、作成されたオブジェクトの数を知ることでした。これは、合計面積と平均面積です。次のような簡単なステートメントでテストしました。

Object first;
Object second;
cout << Object::getObjCounter() << "\n"; 
///I have the get method implement origanally

そして、すべて大丈夫です。オブジェクト クラスがインスタンス数を正しくカウントするようになりました。単純な配列を使用してテストしました:

Object test[ 10 ];
cout << Object::getObjCounter() << "\n";

すごい... 当然のことながら機能します。動的割り当てでテストしました:

Object *test = new Object[ 10 ];
cout << Object::getObjCounter() << "\n";
delete [] test;

繰り返しますが...うまくいきます。しかし、私がしようとすると:

vector< Object > test( 10, Object() );
cout << Object::getObjCounter() << "\n";

標準出力でゼロになります...コンストラクタとデストラクタにフラグを入れて、なぜそれが起こっているのかを確認します。そして、示されているベクトルステートメントを使用すると、デストラクタが順番に呼び出されるよりも、コンストラクタがすぐに呼び出されることがわかります!!!! どうして????私には意味がありません!誰か私にこれを説明してもらえますか? さらに、ベクトルを使用して、単純な配列と同じ効果を達成するのを手伝ってくれる人はいますか? 問題は、要素の削除と追加、サイズ変更などのベクトル機能が必要ですが、車輪を再発明したくないということです。前もって感謝します。

4

2 に答える 2

4

sudopunkはまさにそのとおりです。コピー コンストラクターが必要です。ただし、3 つのルールに従い、コピー代入演算子を定義することもお勧めします。

デストラクタ、コピー コンストラクタ、コピー代入演算子のいずれかがある場合は、これら 3 つすべてを明示的に宣言する必要があります。

それらを定義する方法は次のとおりです。

Object& operator=(const Object& rhs);
Object(const Object&);

コピー コンストラクター、コピー代入演算子、およびデストラクターは、別の場所 (ヒープ上で動的に) に割り当てられたメンバー/リソースを持つクラスにとって非常に重要であることに注意してください。暗黙のコピー コンストラクターと代入演算子は、オブジェクトのメンバーごとのコピーのみを行います。

別の最適化は移動セマンティクスを適用することですが、それは別の話であり、このスレッドの範囲外です。

于 2013-08-23T13:09:30.790 に答える