Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 根据实例数自动设置ID_C++_Class_Oop_C++11_C++17 - Fatal编程技术网

C++ 根据实例数自动设置ID

C++ 根据实例数自动设置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()中,我真的不想这么做。

我的类中有一个简单的方法,它设置ID

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开始编号的连续集(以及单元测试的可重复性等等)。