我需要为类的每个后代分配唯一的整数值,应使用指向这些类或其类型名称的指针来访问这些基类

我是这样实现的

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/

10-11 22:50