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

C++ using static array in base class, declaring in derived class

本文关键字:派生 声明 静态 基类 C++ 数组      更新时间:2023-10-16

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

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){};
   ... 
}

我的解决方案正确吗?有没有更好的方法可以做到这一点?

您可以使用 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() {};
};

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

虚拟实例成员函数可以将工作委托给派生类的重写,该类可以为您执行访问。在静态上下文中没有办法做到这一点(不过,看起来你并没有试图这样做)。

例如,我是否应该在派生类的构造函数中将对静态变量的引用传递给基类构造函数?

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

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

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; }
   ... 
};