2016-04-02 44 views
0

我有类似以下内容:覆盖类成员的值不改变实际implemetation

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结构中有相同的信号名称,如下所示,如果override选项为true,我将不得不使用它。

struct Values1 
{ 
    bool memberBool; 
    uint32_t memberUint32; 
}; 

struct Values2 
{ 
    int memberArray[10]; 
}; 

我愿意接受任何其他的设计/解决方案,但我不想去通过每个地方在几个源文件,做if...else...

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

+0

何男孩........ –

回答

0

你的第一个任务是要真正找出“如何从其他应用程序分配值”,因为直到你做完这个问题,默默无闻。

但假设事实证明,您可以像现在这样命名一个对象,#ifdef确实是这样做的常规方法。 if会造成更糟糕的混乱有运行时损害。这些是你唯一真正的选择(没有一些超大规模的魔法类层次结构,并且完全无法读取模板metahackery),因为C++不支持覆盖数据成员。

所以只要去#ifdef

如果你发现你有在其中写入#ifdef地方太多了,也许这是一个迹象,表明:

  • 这种“模式”是太普遍,其实应该是一个独立的应用程序,或
  • 你的课程没有正确隔离。