计算给定班级中的人数

时间:2012-12-02 20:36:37

标签: c++

怎样才能创建class constructor来计算活着的人数,如果我有10个人则应该计算活着的人数,人应该是对象在这个例子中,假设我有一个class man,如下所示

class man{

     private:
     string name;

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

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


}

我对如何解决它感到困惑,我真的需要一个简单的例子我想使用set和get方法

2 个答案:

答案 0 :(得分:2)

这个理智的版本是将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个对象,BobJimmy。然后在std::vector<man> men中有2个复制这些对象,因为该向量包含“man类型的对象”。

如果我们将其更改为指针:

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

我们现在有以下输出,这是我们正在寻找的:

There is 2 men
There is 2 men

希望这能为你解决问题!

答案 1 :(得分:0)

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

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