2016-04-02 56 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地方太多了,也許這是一個跡象,表明:

  • 這種「模式」是太普遍,其實應該是一個獨立的應用程序,或
  • 你的課程沒有正確隔離。
相關問題