2012-05-22 56 views
1

我的代碼中的一個常見場景是我得到了一個函數,這個函數被層中的很多類使用。哪裏可以定義許多派生類使用的函子?

爲了讓所有類都可以訪問,並保持乾燥,我通常把它定義爲像我的基類的受保護的內部結構:

class Base 
{ 
protected: 
    struct CommonFunctor 
    { 
     bool operator()() 
     { 
      return true; 
     } 
    }; 
}; 

class DerivedA : public Base 
{ 
    void FooA() 
    { 
     bool test = CommonFunctor()(); 
    } 
}; 

class DerivedB : public Base 
{ 
    void FooB() 
    { 
     bool test = CommonFunctor()(); 
    } 
}; 

我不喜歡這樣的解決方案,因爲它雜波我基地有很多小函子的類,它們只是內部的,即使它們不能被公衆訪問,也會降低我的基類的可讀性。

您是否知道該場景的其他解決方案?

+1

它們在與其工作的類相同的命名空間中定義的問題是什麼? –

+0

爲什麼不直接在類定義中聲明函子'operator()()'並在別處定義函數? – hmjd

+0

@hmjd:這就是我所做的。我只爲我的代碼示例合併了定義和聲明。在我的基類頭文件中仍然有很多混亂...... – nabulke

回答

1

剛剛實施新的文件(BaseClassFunctors.cpp + BaseClassFunctors.h)的函子。把它們放在你的名字空間中,並帶有可選的子名稱空間(例如namespace main.internal)。

現在,您可以將頭文件包含在所需的任何派生類中,而不會混淆基類頭。

0

儘管我(顯然,其他人)討厭多重繼承,它會派上用場。

只需創建第二個類,其中包含您的所有仿函數,並在您的子類中派生自Base,繼承Base和這個新類。

+0

我從來沒有想過爲此使用多繼承。感謝您的新見解。 – nabulke

+0

我希望它能回答你的問題。另一個解決方案是讓你的函子類從'Base'派生,然後單獨從函子類派生'DerivedA'和'DerivedB'。不那麼幹淨,更黑客。 –

+0

這當然是我的問題的一個答案。我想知道是否有任何其他解決方案.... – nabulke

0

您可以只實現仿函數在其他地方,仍然保持它作爲基地的成員:

class Base 
{ 
protected: 
    struct CommonFunctor; 
}; 

struct Base::CommonFunctor 
{ 
    bool operator()() 
    { 
     return true; 
    } 
}; 
相關問題