これの正しいバージョンは、man
オブジェクトをコレクションに格納することstd::vector
です。これから、ベクターでstd::vector
使用して、それに含まれるアイテムの数をフェッチできます。size
それ以外の場合は、このコンテキストでは意味をなさないソリューションを使用します。これは、で増加し、で減少するstatic
変数を格納することです。constructor
destructor
ちなみに、man
クラスにはいくつかの間違いがあります。これconstructor
はプライベートであり、角かっこがありません...これがあなたが探しているものの簡単なバージョンです:
class man
{
private:
std::string mName;
public:
man(std::string name="") : mName(name)
{
}
const std::string& GetName() const
{
return mName;
}
};
int main(int argc, char *argv[])
{
man Bob = man("Bob");
man Jimmy = man("Jimmy");
std::vector<man> men; // This will copy the man object, might want to consider using pointers
men.push_back(Bob);
men.push_back(Jimmy);
std::cout << "There is " << men.size() << " men." << std::endl;
std::cout << "Known men are:" << std::endl;
for(std::vector<man>::const_iterator itor = men.begin(); itor != men.end(); ++itor)
{
std::cout << itor->GetName() << std::endl;
}
// You could also iterate using something like for(unsigned int i = 0; i < men.size(); ++i)
}
編集:
静的変数を使用する場合の処理方法を追加しましょう...次のシナリオを参照してください(短くするために括弧の多くを折りたたんでいます)
次のコードを参照してください。
class man
{
private:
static unsigned int sCount;
std::string mName;
public:
man(std::string name="") : mName(name) { ++sCount; }
~man() { --sCount; }
const std::string& GetName() const { return mName; }
static unsigned int Count() { return sCount; }
};
unsigned int man::sCount = 0;
int main(int argc, char *argv[])
{
man Bob = man("Bob");
man Jimmy = man("Jimmy");
std::cout << "There is " << man::Count() << " men" << std::endl;
std::vector<man> men; // This will copy the man object, might want to consider using pointers
men.push_back(Bob);
men.push_back(Jimmy);
std::cout << "There is " << man::Count() << " men" << std::endl;
}
そのための出力は
There is 2 men
There is 1 men
待って...なに?!?どこで男を失ったのですか?さて、これはベクトルのサイズ変更で発生しました。定義しcopy constructor
なかったため、コンパイラが自動的に行いましたが、コンパイラはインクリメントしたいことを認識していなかったsCount
ため、ベクトルのサイズを変更すると、新しいオブジェクトが作成され、古いオブジェクトが作成されました。破壊され、sCount
適切に更新されませんでした。
man
クラスを次のように変更します。
class man
{
private:
static unsigned int sCount;
std::string mName;
public:
man(std::string name="") : mName(name) { ++sCount; }
man(const man& in_man) : mName(in_man.mName) { ++sCount; }
~man() { --sCount; }
const std::string& GetName() const { return mName; }
static unsigned int Count() { return sCount; }
};
私たちは今持っています:
There is 2 men
There is 4 men
しかし、なぜ?!?。スタックには2つman
のオブジェクトがBob
ありますJimmy
。次に、ベクトルに「タイプのオブジェクト」が含まれているため、これらのオブジェクトの2つのコピーがあります。std::vector<man> men
man
これをポインタに変更した場合:
std::vector<man*> men;
men.push_back(&Bob);
men.push_back(&Jimmy);
これで、次の出力が得られました。これが私たちが探しているものです。
There is 2 men
There is 2 men
これがあなたのために物事をクリアすることを願っています!