簡體   English   中英

_p.h文件的目的是什么?

[英]What is purpose of _p.h files?

在Qt源文件中,有兩個版本的頭文件,例如:

qxmlstream.h
qxmlstream_p.h

為什么有_p.h文件?

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

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

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

void * malloc128 (void) { ... }

由於這對您的子系統用戶來說可能具有可疑價值,因此將其作為官方API的一部分發布是沒有意義的,但是您自己的源文件中的一個都需要原型,因此您將其放在私有頭文件中。

然后你自己的代碼使用:

#include "mysubsystem_p.h"

您的API用戶使用:

#include "mysubsystem.h"

Qt需要保持穩定的外部鏈路級接口。 要解決這個問題,他們會使

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


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

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

這可以被稱為設計模式,用於通過隱藏類的用戶不需要知道的所有內容來增加給定類的頭文件的可讀性。

因此,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;
};

換句話說,所有私有類成員因此被“導出”到私人使用的類的公共定義中。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM