私は、作成されたすべてのインスタンスが一意の 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...