【问题标题】:C++ using static array in base class, declaring in derived classC++ 在基类中使用静态数组,在派生类中声明
【发布时间】:2015-02-01 15:21:06
【问题描述】:

我正在尝试创建一些类,它们都是抽象类(我们称之为)BaseClass 的派生类。在 BaseClass 中,我想对派生类中声明的 static 变量(数组)进行操作。 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){};
   ... 
}

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

【问题讨论】:

  • 抱歉,刚刚注意到它是静态的。我想你可以使用 CRTP。
  • 命名当然不是最好的选择:std::vector&lt;float&gt; &amp;vector;应该是s.th。至少喜欢std::vector&lt;float&gt; &amp;vector_;
  • 就您描述的目的而言,您的解决方案看起来简单、优雅且高效。

标签: c++ inheritance static


【解决方案1】:

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

【讨论】:

  • 我不确定这是否能如我所愿,因为 v 是在 getVector() 方法中声明的,而不是在类中。这样的声明会使 v 对于 DerivedClass 中的每个对象都具有相同的向量吗?
  • 是的。既然是static成员变量,就只有一个。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-07-04
    • 2021-10-18
    • 2014-03-21
    • 2023-03-23
    • 2010-10-17
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2014-04-27
    相关资源
    最近更新 更多