理智的版本是将您的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
等等……什么?!?我们在哪里失去了一个人?好吧,这发生在向量调整大小时,因为我们没有定义 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
希望这可以为您解决问题!