2012-05-03 29 views
2

我正在使用C++(Qt)。擴展具有私有構造函數和析構函數的單例類給出編譯時警告

我正在擴展一個單例類,而一個子類只有靜態方法。 我沒有創建子類的任何實例。 Singleton類的構造函數和析構函數都是私有的,所以我不能訪問它的構造函數和析構函數。

class Singleton 
{ 
    private : 
      Singleton(); 
      ~Singleton(); 
    public : 
     // some methods. 
} 

class SubClass : public Singleton 
{ 
    // There is NO constructor or destructor 
    public: 
    // Only some STATIC methods. 
} 

我使用子類::的getInstance()父,它調用的getInstance()。 我只使用SubClass的靜態方法(所以不需要實例化子類)。

所以我的問題是,我得到的編譯警告 -

「子類:未能生成析構函數,因爲一個基類的析構函數是無法訪問」。

我想擺脫這些警告和 也想知道這是違反單身設計模式的設計?


我想達到什麼目的?

我正在爲應用程序創建一個記錄器。我正在使用第三方庫的記錄器類(QxtCore庫的QxtLogger)。這個QxtLogger類是一個單例,具有私有的構造函數和析構函數。我想要一個包含QxtLogger具有的所有方法的單例類以及一些額外的靜態方法(這些方法對我的應用程序是特定的)。

所以我創建了一個繼承QxtLogger的類,並在其中添加了一些靜態方法。我擔心的是擴展生成警告的單例類(因爲基類構造函數和析構函數不可訪問)。 那我該怎麼辦?

+0

'virtual〜Singleton();' – Feo

+1

應該基類的dtor保護嗎?如'protected:virtual〜Singleton();' – rt2800

+2

當你僅僅向子類添加靜態方法時,爲什麼你想要繼承這個單例?除了你的問題,這種情況似乎沒有多大意義。你意識到可以直接調用子類而不需要實例嗎? – Raam

回答

4

您不能擴展沒有可見構造函數的類。這就是班級設計師的意圖。

如果他們想要擴展這個類,他們會創建構造函數/析構函數protected

我建議你使用組合而不是繼承。

+0

我想要的類應該具有所有的單身人士的功能和一些額外的靜態方法。所以我擴展了單身人士課程。這可以通過編寫一個包裝類來實現。這將結束大量的包裝方法。不應該是個好主意。底線代碼工作正常,但給出了一些警告。 – EngineeredBrain

+0

你有沒有看到更好的方法來解決這個問題? – EngineeredBrain

+0

@AnwarShaikh我已經說過你應該使用合成,即使這意味着有包裝方法。對我來說,這聽起來像是唯一正確的解決方案,尤其是考慮到構造函數/析構函數被標記爲私有 - 對於不被擴展的類的明確意圖。 –

2

STOP!

除了Singleton反模式的可疑使用(再次)之外,您應該記住C++不是Java。

因此,有更好的繼承來擴展一個類的功能:自由功能!

void extend1(Singleton& s, ...); 

int extend2(Singleton const& s); 

注意,這些功能需要Singleton類引用有2個原因:

  • 變得明確,他們依賴於它
  • 它鋪平了道路走向重構,因爲當你」我會擺脫Singletonness
相關問題