2016-02-24 49 views
-1

比方說,我有以下代碼:檢查函數被調用或不

// I'll be providing these 3 
int a = 0; 
void setA(){ a = 1000;} 
void processA() { std::cout << a; } 

// User will call them 
int main(){ 
    // setA(); // <-- Notify about this 
    processA(); 
    return 0; 
} 

在這裏,我必須確保有人打電話processA()之前調用setA()。我想過2的方式來做到這一點:

  • 呼叫setA()只是內部processA()功能或只是轉儲setA()裏面的內容processA()
  • 保持一個布爾標誌,並在稍後的狀態檢查,以確保setA()一直叫

現在第一個方法是有道理的,但問題是setA()功能將比processA()叫早了很多,我不能做到這一點。第二種方式很好,但依賴於運行時間。

有沒有辦法在編譯時做這項工作,以便有消息/警告或編譯器警告是提醒用戶他/她在處理它之前沒有調用setA()的最好方法。

+0

@KerrekSB哪個問題?我以前沒有問過這個問題。 –

+1

某種「一次」標誌似乎很合適。你可以在'setA()'中無條件地設置它,'processA()'可以檢查這個標誌並有條件地調用'setA()'。或者你可以從字面上使用['std :: call_once'](http://en.cppreference.com/w/cpp/thread/call_once)。 –

+7

創建一個'A類',它在構造函數中初始化其成員。然後在該對象上調用'process'。 –

回答

1

可能您正在尋找封裝。只寫一類,使用戶不可能忘記調用setA()

class Foo { 
    public: 
     Foo() { setA(); } 
     process() { /*...*/ } 
    private: 
     void setA() { /*...*/ } 
     int a; 
}; 
+0

嗯,這可以做到,現在我要測試是否仍然會調用構造函數,如果我聲明構造函數專用於使用過程作爲靜態方法。 –

+0

好吧...這將是一個不同的問題,不,如果你使析構函數私人化,你不能創建該類的對象(你可以,但簡短的答案是:你不能)。靜態方法不需要一個對象,因此調用靜態方法不關心構造函數 – user463035818

+0

...但爲什麼靜態方法? – user463035818