抽象类和静态方法

时间:2011-07-21 17:37:44

标签: c++ abstract-class static-methods

我有一个抽象类:

class A
{
  public:
  bool loaded_;
  virtual int load() = 0;
}

以及几个派生类:

class B:public A
{
  public:
  int load();
  static B& instance();
}  

class C:public A
{
  public:
  int load();
  static C& instance();
}  

事实上,:: instance()方法中的代码对于每个类都是相同的:

static B& B::instance()
{
  static B instance_;
  if (!instance_.loaded_)
  {
    instance_.load();
    instance_.loaded_=true;
  }
  return instance_;
}

static C& C::instance()
{
  static C instance_;
  if (!instance_.loaded_)
  {
    instance_.load();
    instance_.loaded_=true;
  }
  return instance_;
}

我想对这个:: instance方法进行分解,但是假设它使用了虚方法:: load,我无法在类A中定义它。 从理论上讲,我知道这很奇怪,因为A类应该有0个实例和B,C应该有1个实例,但是这个代码应该被分解也是有道理的。

你会如何解决这个问题?

2 个答案:

答案 0 :(得分:8)

您可以将instance()设为免费功能模板:

template<class T>
T& instance()
{
  static T instance_;
  if (!instance_.loaded_)
  {
    instance_.load();
    instance_.loaded_=true;
  }
  return instance_;
}

然后你可以像这样使用它:

instance<B>().do_stuff()

答案 1 :(得分:3)

这是CRTP的常见用法,定义在模板中创建实例的函数,然后在每种类型中实例化它:

struct A {
   virtual ~A() {}     // don't forget to make your destructor virtual!
   virtual void load() = 0;
};
template <typename T>
struct instance_provider {
    static T& instance() { /* implementation */ }
};
struct B : A, instance_provider<B> {
   virtual void load();
};
struct C : A, instance_provider<C> {
   virtual void load();
};