0

私は、作成されたすべてのインスタンスが一意の objID を持つことを許可する必要があるプロジェクトに取り組んでいます。すべてのクラスは、具体的なクラス コンストラクターが呼び出されるたびに増加する静的変数を持つ 1 つの基本クラスから継承します。カウンターは、プログラムが終了するまで実行され続けます。

私が抱えている問題は、配列 (任意の C++ コンテナー) を使用すると、objID が複数のインクリメントを登録することです。

例: 私main()は を作成vector<ConcreteClassA> cc;し、 をpush_back(...)2 回実行しました。

私の出力は次のとおりです。

objID = 5, and count = 2

期待される結果:

objID = 2, and count = 2

なぜ私ObjIDがそれぞれに複数回登録しているのかわかりませんpush_back(...)。すべての場所を調べてチェックしassign()、具象クラスのコンストラクターでのみ my が呼び出されるようにしました。

お知らせ下さい。

//===========================================================================   
//Main.cpp

#include "ConcreteClassA.h";

#include <iostream>
#include <vector>
#using namespace std;

int main()
{
    vector<ConcreteClassA> c1;
    cc.push_back( ConcreteClassA() );
    cc.push_back( ConcreteClassA() );

    return 0;
}

    //objID is off for some reason....
    //Expected Results: count = 2, objID = 2
    //Output: count = 2, objID = 5

//===========================================================================
//IBase.h file
private: 
    static int objID;      //used to assign unique IDs
    static int count;      //track how many stances of all objs are active

protected:        
    const int assignID();  //return a new ID
    void decrementCount(); //decrement count, when an obj is removed
//===========================================================================

//IBase.cpp
int IBase::objID = 0;
int IBase::count= 0;

const int IBase::assignID()
{
    ++ this->count;
    ++ this->objID;

    return ( this->objID );
}

void IBase::decrementCount()
{
    -- this->count;
}

//===========================================================================
ConcreteClassA.h

ConcreteClassA();     //default constructor
ConcreteClassA(...);  //couple overloaded constructors
~ConcreteClassA();    //destructor

ConcreteClassA( const ConcreteClassA &cc );           //copy constructor
ConcreteClassA& operator=(const ConcreteClassA &cc);  //assignment operator

//more methods....

//===========================================================================
ConcreteClassA.cpp

//destructor makes sure instances tracking counter is decremented
ConcreteClassA::~ConcreteClassA()
{
    this->decrementCount();
}

//only constructors and assignemnt operators call assign() method
ConcreteClassA::ConcreteClassA()
{
    //some other initialization...
    this->assignID();
}
//All other methods implementation left out for sensitivity of real estate...
4

2 に答える 2

2

オブジェクトのコピーを考慮する必要があります。C ++ではvector<T>::push_back()、オブジェクトのコピーをベクターに配置します。関数呼び出しで作成した一時インスタンスは破棄されます。そのため、「作成された」カウントは「アクティブな」カウントよりも多くなります。

オブジェクトのインスタンスの作成に本当に気を配りたい場合は、ベクターにポインターを格納する必要があります。そうすれば、それらを明示的に作成して破棄する必要があります。

これはそのようなものに関する素晴らしい投稿です: https ://stackoverflow.com/a/1361227/2174

于 2012-02-08T21:43:35.680 に答える
0
void IBase::decrementCount()
{
    -- this->count;
}

うわー、私はそこで演算子の優先順位をチェックしていませんが、私は書きます

void IBase::decrementCount()
{
    -- (this->count);
}

よく考えずに。(良いガイドラインは、疑問がある場合や確認したい場合は、より明確に書くことです)。

そして、はい、それはただあるべきです

void IBase::decrementCount()
{
    --count;
}
于 2012-02-08T21:59:01.667 に答える