我最近发现sbi 的 Kornel 解决方案版本非常有用。谢谢你们两位提供答案。但是,我想进一步扩展解决方案,以便可以轻松创建几种类型的 ID,而无需为每个新类型创建一对单独的 id_impl 和 id_base 类。
为此,我对 id_impl 类进行了模板化,并向 id_base 添加了另一个参数。结果被封装在一个头文件中,该文件包含在任何想要添加新 ID 类型的地方:
//idtemplates.h
template< class T >
class GeneralID
{
private:
GeneralID() {}
static int GetNextID()
{
static int counter = 0;
return ++counter;
}
template< class T, class U >
friend class GeneralIDbase;
};
template< class T, class U >
class GeneralIDbase : private GeneralID < T >
{
public:
static int GetID() { return ID; }
private:
static int ID;
};
template< class T, class U >
int GeneralIDbase<T, U>::ID = GetNextID();
对于我的应用程序,我希望几个抽象基类具有与之关联的 ID 类型。因此,对于 GeneralIDbase 模板的每个实例,指定的类型是:正在声明的派生类的抽象基类,以及正在声明的派生类。
以下 main.cpp 是一个示例:
//main.cpp
#include<iostream>
#include<idtemplates.h>
using namespace std;
class MyBaseClassA {};
class MyBaseClassB {};
class MyClassA1 :public MyBaseClassA, public GeneralIDbase<MyBaseClassA, MyClassA1> {};
class MyClassA2 :public MyBaseClassA, public GeneralIDbase<MyBaseClassA, MyClassA2> {};
class MyClassB1 :public MyBaseClassB, public GeneralIDbase<MyBaseClassB, MyClassB1> {};
class MyClassB2 :public MyBaseClassB, public GeneralIDbase<MyBaseClassB, MyClassB2> {};
int main()
{
MyClassA1 objA1;
MyClassA2 objA2;
cout << "objA1.GetID() = " << objA1.GetID() << endl;
cout << "objA2.GetID() = " << objA2.GetID() << endl;
MyClassB1 objB1;
MyClassB2 objB2;
cout << "objB1.GetID() = " << objB1.GetID() << endl;
cout << "objB2.GetID() = " << objB2.GetID() << endl;
cin.get();
return 0;
}
这段代码的输出是
/*
objA1.GetID() = 1
objA2.GetID() = 2
objB1.GetID() = 1
objB2.GetID() = 2
*/
我希望这有帮助!请让我知道任何问题。