覆盖类成员值而不更改实际实现

时间:2016-04-02 22:25:22

标签: c++ design-patterns

我的课程如下:

class SignalProcessor
{
  //....

  bool memberBool;
  uint32_t memberUint32;

  int memberArray[10];
  //...
  float memberfloat;
};

SignalProcessor实现用于控制系统,具有一些复杂的算法。

现在我必须覆盖那些成员值的 某些 ,其他一些值来自另一个应用程序,用于诊断/调试目的。

一种方法是在代码中的每个位置使用#ifdefif... else..一堆来污染整个实现。

所以我很好奇我是否只能在SignalProcessor标头内做任何事情来覆盖这些值,如下所示。

SignalOverride< bool, true > memberBool;
SignalOverride< uint32_t, false> memberUint32;
SignalOverride< int, true> memberArray[10];

// SignalOverride 
template <typename T, bool overrideOn >
class  SignalOverride
{
   T operator=(const T& value )
   {
      if( !overrideOn )
      {
         m_signal = value;
      }
      else
      {
         /* m_signal =  ???
          Not entirely sure how to assign values here from other  application.
         */
      }
      return *this;
   }

   operator T () const
   {
      return m_signal ;
   }   

   // ...
   private:
    T m_signal;
}

另一个应用程序在下面的几个C结构中具有相同的信号名称,如果覆盖选项为true,我将不得不使用它。

struct Values1
{
  bool memberBool;
  uint32_t memberUint32;   
};

struct Values2
{
  int memberArray[10];   
};

我对任何其他设计/解决方案持开放态度,除了我不想浏览多个源文件中的每个地方并执行if...else...

我只能使用 C++98 (可怜我)

1 个答案:

答案 0 :(得分:0)

你的第一个任务是真正找到&#34;如何在这里从其他应用程序中分配值&#34;,因为在你完成之前,整个问题绝对没有实际意义。

但是假设事实证明你可以像现在一样命名一个对象,#ifdef确实是传统的方法。 if会使情况更糟,会对运行时造成不利影响。这些是你唯一真正的选择(没有一些超级庞大的魔术类层次结构和完全不可读的模板元),因为C ++不支持覆盖数据成员。

所以只需使用#ifdef

如果您发现有太多地方可以写#ifdef,或许这表明:

  • 这个&#34;模式&#34;过于普遍,实际上应该是一个单独的应用程序,或
  • 你的课程没有相互隔离。