我需要为类的每个后代分配唯一的整数值,应使用指向这些类或其类型名称的指针来访问这些基类。
我是这样实现的
class Base {
public:
int idCompType = InvalidCompType;
virtual int getCompType() = 0;
}
然后在base的每个后代中,我应该声明idCompType(对于模板)并覆盖getCompType(对于指针):
class Real1: public Base {
public:
int idCompType = 1;
int getCompType() override { return idCompType; }
}
现在我可以找到从指针到基本的复合类型
Base *comp = getComp(...);
std::cout << comp->getCompType();
或在模板中使用typename:
template <typename T>
int getType() {
return T::idCompType;
}
有没有一种方法可以使每个子孙类中没有双重声明idCompType和getCompType()时变得更加简单?在Object Pascal中,我使用虚拟静态方法实现了这一点,但是C++中不允许使用它们。
PS:问题不是关于虚拟静态方法-虚拟静态方法只是可能的解决方案之一,也是用其他语言解决我的问题的方式。
最佳答案
我的建议:
对Base
的更改:
class Base {
public:
virtual int getCompType() = 0;
protected:
static int getNextCompType()
{
static int nextType = 0;
return ++nextType;
}
};
对派生类的更改:
class Real1: public Base {
public:
static int getCompTypeImpl()
{
static int myType = Base::getNextCompType();
return myType;
}
int getCompType() override
{
return getCompTypeImpl();
}
};
这是一个工作程序:
#include <iostream>
class Base {
public:
virtual int getCompType() = 0;
protected:
static int getNextCompType()
{
static int nextType = 0;
return ++nextType;
}
};
class Real1: public Base {
public:
static int getCompTypeImpl()
{
static int myType = Base::getNextCompType();
return myType;
}
int getCompType() override
{
return getCompTypeImpl();
}
};
class Real2: public Base {
public:
static int getCompTypeImpl()
{
static int myType = Base::getNextCompType();
return myType;
}
int getCompType() override
{
return getCompTypeImpl();
}
};
template <typename T> int getCompType()
{
return T::getCompTypeImpl();
}
int main()
{
Real1 v1;
Real2 v2;
std::cout << v1.getCompType() << std::endl;
std::cout << v2.getCompType() << std::endl;
std::cout << getCompType<Real1>() << std::endl;
std::cout << getCompType<Real2>() << std::endl;
};
输出:
1个
2
1个
2
关于c++ - 虚拟静态变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29069920/