C++ 根据实例数自动设置ID
我的类中有一个简单的方法,它设置IDC++ 根据实例数自动设置ID,c++,class,oop,c++11,c++17,C++,Class,Oop,C++11,C++17,我的类中有一个简单的方法,它设置ID void Instructor::setInstrID(const int newInstrID) { instrID = newInstrID; } 我希望不是手动设置id,而是制定一种方法,使讲师的第一个实例自动获取id 0,当第二个实例初始化时,它应该自动具有id=1,依此类推。现在我不知道该怎么做 这应该在方法中吗?还是应该在我的main()函数中?如何检查是否存在任何现有实例?我想做一个向量,但那将是在main()中,我真的不想这么做。
void Instructor::setInstrID(const int newInstrID)
{
instrID = newInstrID;
}
我希望不是手动设置id,而是制定一种方法,使讲师的第一个实例自动获取id 0,当第二个实例初始化时,它应该自动具有id=1
,依此类推。现在我不知道该怎么做
这应该在方法中吗?还是应该在我的
main()
函数中?如何检查是否存在任何现有实例?我想做一个向量,但那将是在main()
中,我真的不想这么做。有潜在客户吗?一个简单的解决方案是添加一个静态
成员,统计已存在的实例数
class foo
{
private:
// Next ID to assign
static unsigned int counter;
// This instance's ID
unsigned int instrID = counter++;
};
unsigned int foo::counter = 0;
如果创建的实例数量超过unsigned int
所能表示的数量,则可能会遇到问题。只要实例的销毁顺序与创建顺序大致相同,就可以了
如果您想要线程安全的替代方案,您可以使用
std::atomic
。一个简单的解决方案是添加一个static
成员来统计已经存在的实例数
class foo
{
private:
// Next ID to assign
static unsigned int counter;
// This instance's ID
unsigned int instrID = counter++;
};
unsigned int foo::counter = 0;
如果创建的实例数量超过unsigned int
所能表示的数量,则可能会遇到问题。只要实例的销毁顺序与创建顺序大致相同,就可以了
如果您想要线程安全的替代方案,可以使用
std::atomic
。请记住,这种设计会对您的客户端造成何种限制。如果您有两个不同的客户端需要自己的ID流,那么您就拒绝让它们拥有从0开始编号的连续集(以及单元测试的可重复性等等)。请记住,这种设计对您的客户机有什么样的限制。如果您最终拥有两个不同的客户机,它们需要自己的ID流,那么您就拒绝了它们使用从0开始编号的连续集(以及单元测试的可重复性等等)。