0

class生きている人の数を数えるaを作成するconstructorにはどうすればよいですか?私が10人いる場合は、生きている人の数を数える必要があります。この例では、人はオブジェクトである必要がありますclass man

class man{

     private:
     string name;

   man(string name=""){
     cout<<"there 10 people alive"<<endl;

~man(){}
};
int main(){


}

私はそれについてどうやって行くのか混乱しています、私は本当に簡単な例が必要です私はsetとgetメソッドを使いたいです

4

2 に答える 2

2

これの正しいバージョンは、manオブジェクトをコレクションに格納することstd::vectorです。これから、ベクターでstd::vector使用して、それに含まれるアイテムの数をフェッチできます。size

それ以外の場合は、このコンテキストでは意味をなさないソリューションを使用します。これは、で増加し、で減少するstatic変数を格納することです。constructordestructor

ちなみに、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> menman

これをポインタに変更した場合:

std::vector<man*> men; 
men.push_back(&Bob);
men.push_back(&Jimmy);

これで、次の出力が得られました。これが私たちが探しているものです。

There is 2 men
There is 2 men

これがあなたのために物事をクリアすることを願っています!

于 2012-12-02T20:47:33.947 に答える
0

staticクラスフィールドを使用して人数をカウントします。

このような変数は、特定のクラスのすべてのオブジェクト間で共有されるため、コンストラクターで変数を増やし、デストラクタで減らすと、「人」がカウントされます。

于 2012-12-02T20:47:42.857 に答える