0

如何创建一个计算活着的人数的a,如果我有10个人,它应该计算活着的人数,在这个例子中人应该是对象,假设我在下面有class这样的constructorclass 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

等等……什么?!?我们在哪里失去了一个人?好吧,这发生在向量调整大小时,因为我们没有定义 a 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

但是为什么?!?. man堆栈上有 2 个对象,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

希望这可以为您解决问题!

于 2012-12-02T20:47:33.947 回答
0

使用static类字段来计算人数。

此类变量在给定类的所有对象之间共享,因此在构造函数中增加它并在析构函数中减少将计入“人”。

于 2012-12-02T20:47:42.857 回答