C ++在基类中使用静态数组,在派生类中声明

时间:2014-12-03 21:45:26

标签: c++ inheritance static

我试图创建一些类,这些类都是抽象类的派生类(让我们称之为) BaseClass 。在BaseClass中,我想对派生类中声明的静态变量(数组)进行操作。在C ++中是否有一种聪明的方法让编译器知道静态变量将在派生类中声明?或者,例如,我应该在我的派生类中使用'构造函数将对静态变量的引用传递给基类构造?这是我的想法:

class BaseClass
{
   std::vector<float> &vector;

public:
   BaseClass(std::vector<float> &dVector):vector(dVector){};

   void vectorOperation()
   {
       vector.doSomething();
   }
   ...     
}

class DerivedClass : public BaseClass
{
   static std::vector<float> sVector;
   DerivedClass():BaseClass(sVector){};
   ... 
}

我的解决方案是否正确?有没有更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:3)

您可以使用CRTP模式,但我不相信它比您拥有的更好。

template <typename Derived>
class BaseClass
{
   std::vector<float> &vector;

public:
   BaseClass(): vector(Derived::getVector()){};

};

class DerivedClass : public BaseClass<DerivedClass>
{
   public:

   static std::vector<float>& getVector()
   {
      static std::vector<float> v;
      return v;
   }

   DerivedClass() {};
};

答案 1 :(得分:2)

  

在BaseClass中,我想对派生类中声明的静态变量(数组)进行操作。

虚拟实例成员函数可以将工作委派给派生类的覆盖,派生类可以为您进行访问。在静态上下文中无法做到这一点(虽然看起来不像你试图这样做)。

  例如,我应该在我的派生类中使用&#39;构造函数将对静态变量的引用传递给基类构造函数吗?

这也是一个解决方案。但是,派生类的所有实例都将访问相同的静态数据区域,并且需要存储对它的引用。

基于虚函数的解决方案不需要额外的存储空间来引用向量:

class BaseClass
{
protected:
   virtual std::vector<float>& vector() = 0;

public:
   void vectorOperation()
   {
       vector().doSomething();
   }
   ...     
};

class DerivedClass : public BaseClass
{
   static std::vector<float> sVector;
protected:
    std::vector<float>& vector() { return sVector; }
   ... 
};
相关问题