2010-06-29 171 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; 
}; 

换句话说定义,所有的私有类成员因此被“输出”为私人使用的阶级的公共定义。

对我来说,这是一种使类的头文件,用户将处理,更具可读性的方法。当需要大量私人成员的课程时尤其如此。