2012-11-11 358 views
8

我有一個類似::靜態函數調用非靜態函數在C++

Class Test 
{ 
    public: 
    void Check(){//dosomething}; 
    static void call(){//I want to call check()}; 
}; 

由於呼叫()是一個靜態成員,所以它不能調用非靜態功能,所以我想使用call()中的Check()是爲了創建Test指針,然後指向Check(),但我認爲它不好,有沒有更好的方法來做到這一點? 我可以重寫靜態函數中的所有東西,所以我不需要再次調用Check(),但我想要的是重用Check()中的代碼並避免重複的代碼。

+0

目前尚不清楚你想要做什麼。你可以想出一百萬種用語言來破解它的方法,但最終你在這種情況下的原因是你的需求沒有意義。 'call'中沒有對象上下文。你爲什麼認爲你需要這樣做? –

+0

爲什麼不聲明'檢查'一個靜態函數? –

+1

您需要'class test'的實例來調用任何非靜態函數(即'this'指針)。 – mark

回答

9

因爲你需要一個實例,你要麼必須創建一個,使用一個靜態實例,或回教call()

Class Test 
{ 
    private: 
    static Test instance; 

    public: 
    void Check(){//dosomething}; 
    // use one of the following: 
    static void call(Test& t){ t.check(); }; 
    static void call(){ Test t; t.check(); }; 
    static void call(){ instance.check(); }; 
}; 
+1

如何設置實例變量? – JavaRunner

3

這聽起來像有一些不好的設計正在進行。

無論如何,你可以做的是創建一個Test in的實例,並調用該實例的Check。調用的執行將是這樣的,那麼:

void call(){ 
    Test test; 
    test.Check(); 
} 

但請注意,如果不檢查與測試成員的東西,它會ofcourse只適用於創建的測試對象。我會重新思考你是否真的希望電話是靜態的,或者檢查不是。

0

有沒有簡單的答案。你可以做很多事情,但是哪一個是正確的取決於你的代碼的含義。這是一個設計的問題,而不是一個編程問題。

你已經提出了各種各樣的編程技巧,你可以做,例如創建Test指針(其實你不需要Test指針,只是一個Test對象)。我可以建議更多的技巧,例如,你可以重寫call(),以便它不是靜態的,或者(幾乎相同的事情),你可以通過Test指針作爲參數call()並使用它,或者你可以創建一個全局對象並且使用它。這些都不是問題的核心。爲了回答你的問題,你必須問自己這樣的問題,爲什麼我首先將call()設爲靜態,爲什麼一個靜態函數需要調用一個非靜態函數。

如果你能解釋一下,那麼給出更具體的建議就容易多了。

0

非靜態和靜態成員函數之間的關鍵不同之處在於後者沒有任何對象。但是,它仍具有與所有其他成員相同的訪問權限。

但是,當您想從靜態成員調用非靜態成員函數時,仍然需要創建一個對象。通常情況下,靜態成員函數會在某個上下文中傳遞以獲取對象。從你的問題的聲音看來,靜態和非靜態函數似乎是做類似的事情,不需要和對象。在這種情況下,它可能是最好的因素的共同部分,不依賴任何物體上,到另一個函數,然後從兩個call()Check()叫:

void Test::call() { 
    common(); 
    // ... other code 
} 
void Test::Check() { 
    common(); 
    // ... other code, possibly depending on "this" 
} 
void Test::common() { 
    // logic shared by both call() and Check() but not depending on "this" 
} 

如果通用代碼需要一個對象,也沒有除了在靜態成員函數中提供對象之外的其他方法。