2013-01-13 41 views
0

這是一個簡單的問題,但我想就如何解決它提出建議。我有一個Policy類與構造函數Policy::Policy(const int& mode)使用C++靜態類成員來控制所有類實例的「模式」

根據mode的值,Policy對象可以具有不同的行爲和特徵。例如,假設有3種可能的模式運行我的程序,對應於mode=1,mode=2mode=3。現在,在任何時候都不會有Policy具有不同模式值的對象。

因此,對我來說有一個變量static int Policy::MODE以便所有的Policy對象知道它們應該在哪個模式下運行。創建的第一個Policy對象將在其構造函數中設置此靜態類變量的值。然後,如果嘗試使用不同值mode創建任何其他Policy對象,則實例化將退出且出現錯誤(因爲這不應該發生)。

有關如何解決此問題的任何建議?

[附加解釋響應下面添加評論請求。]

該程序是用於優化疾病篩選策略。每個Policy對象代表一個篩選策略,並具有許多必要的功能,以便跟蹤反映在人羣中實施該策略的影響的統計數據。按照優化的說法,每個篩選策略是決策變量的向量,通過使用疾病的自然歷史模型模擬策略來估計目標函數。

Policy對象需要能夠無縫地適應多個複雜的優化框架。它不僅需要能夠代表疾病篩查政策,還需要能夠代表任何數量的標準測試問題,可用於測試優化算法是否運行良好。根據Policy類的MODE值改變的特徵/特徵如下:(1)用於評估策略的模擬模型,(2)構造函數中用於設置諸如決策長度之類的事物的代碼變量向量,以及(3)用於顯示關於給定策略及其估計性能的信息的代碼。

對於任何特定的仿真模型(即目標函數),存在多個「策略表達式」(即決策變量的向量),其可以被解碼爲仿真模型所需的策略表達式。因此,每個「模式」代表一種表達篩選策略的方式與特定模擬模型的配對以評估該策略。

留出了很多不相關的東西,這裏將是類的結構,如果有隻是2個不同的運行模式:

class Policy { 
public: 

    vector<double> x; // encoded representation of a policy (decision variables) 

    explicit Policy(const int& mode) { 

     // set Policy::MODE if not already set (code not shown) 

     switch(MODE) { 
     case 1: 
      // code... 
      break; 
     case 2: 
      // code... 
      break; 
     } 
    } 

    void simulate() { 

     switch(MODE) { 
     case 1: 
      // code... 
      break; 
     case 2: 
      // code... 
      break; 
     } 
    } 

    void displayInfo() { 

     switch(MODE) { 
     case 1: 
      // code... 
      break; 
     case 2: 
      // code... 
      break; 
     } 
    } 

private: 
    static int MODE; 
}; 

在高層次上,可以說,每一種模式值代表解決方案與估算器的配對。

+2

設計聽起來是錯誤的。每個班級應該代表一件事情,這裏的「政策」代表3。你能詳細解釋爲什麼你這樣做嗎? –

+1

似乎應該是'顯式的Policy :: Policy(const int&mode)' –

+0

@AlexChamberlain我添加了我正在做的事情的解釋。告訴我你是否有更好的設計建議。謝謝! – synaptik

回答

1

你問類似的東西:

static int Policy::MODE=-1; 
Policy::Policy(const int& mode) { 
    if (MODE==-1) { 
    MODE=mode; 
    } 
    else { 
    if (mode!=MODE) { 
     cout <<"mode mismatch "<<...<<endl; 
     exit (1); // or throw something, set some flags, depending on your needs 
    } 
    } 
} 
+0

是的,確切地說。這正是我曾經想過的。我很高興看到其他人也認爲這是一個好方法。 – synaptik

+2

Yuck!拋出異常!不要'退出'... –