2010-06-29 140 views

回答

8

它們通常是專用頭文件,用於使子系統的組件知道所有內容,但用戶不需要。

換句話說,如果Qt的用戶不需要了解它們,那麼Qt中的多個C源文件可能想要知道的東西將在私有頭文件中。

一個示例可能是您的子系統的自定義內存分配器。也許你知道你盡內存分配爲128個字節,那麼你可以提供這樣的分配:

void * malloc128 (void) { ... } 

因爲這很可能是價值令人懷疑你的子系統的用戶,沒有點發布爲的一部分官方API但你自己的單個源文件需要原型,所以你把它放在私人頭文件中。

然後你自己的代碼使用:

#include "mysubsystem_p.h" 

,而你的API使用的用戶:

#include "mysubsystem.h" 
2

的Qt需要維持穩定的外部鏈路級接口。爲了解決他們使用另一個方法:

class MyClass { 
public: 
    size_t compatSize(); 
private: 
    MyClassPrivate *data; 
}; 


// implementation 
struct MyClassPrivate { 
    int someFieldThatCanChange; 
}; 
size_t compatSize() { return (size_t)(data->someFieldThatCanChange); } 

通過這樣做實現這一變化不會影響大小和MyClass結構。而且您仍然可以添加新字段或刪除舊字段。
其他方法是對每個方法使用「接口」(抽象類),工廠和虛函數 - 這會導致代碼變慢。

0

這可以稱爲設計模式,用於通過隱藏類的用戶不需要了解的所有內容來提高頭文件對給定類的可讀性。

因此,Qt通常選擇將來自某個類的私有數據放入一個單獨的類中,而不是從由公共和私有數據組成的給定類頭中定義頭文件。然後這個單獨的類被用作原始類的私有成員。

例如而不是有:

class MyClass 
{ 

public: 
    MyClass(); 
    ~MyClass(); 

    QVariant getValue1(); 
    QVariant getValue2(); 
    QVariant getValue3(); 

private: 
    QVariant m_Value1; 
    QVariant m_Value2; 
    QVariant m_Value3; 
}; 

我們可以有如下因素

class MyClass 
{ 

public: 
    MyClass(); 
    ~MyClass(); 

    QVariant getValue1(); 
    QVariant getValue2(); 
    QVariant getValue3(); 

private: 
    friend class MyClassPrivate; 
}; 

其中MyClassPrivate是這樣

class MyClassPrivate 
{ 

public: 
    MyClassPrivate(); 
    ~MyClassPrivate(); 

    QVariant m_Value1;  
    QVariant m_Value2; 
    QVariant m_Value3; 
}; 

換句話說定義,所有的私有類成員因此被「輸出」爲私人使用的階級的公共定義。

對我來說,這是一種使類的頭文件,用戶將處理,更具可讀性的方法。當需要大量私人成員的課程時尤其如此。