d-pointers在Qt中被大量使用,它們是pimpl習語的實現。我知道pimpl習語的優點和缺點。但是我錯過了d指針實現的優點。 Here和here是d指針的樣本。 只是使用這個更簡單嗎?使用D指針有什麼優點和缺點?
class MyClassPrivate;
class MyClass {
// interface methods
private:
MyClassPrivate *pimpl_;
};
d-pointers在Qt中被大量使用,它們是pimpl習語的實現。我知道pimpl習語的優點和缺點。但是我錯過了d指針實現的優點。 Here和here是d指針的樣本。 只是使用這個更簡單嗎?使用D指針有什麼優點和缺點?
class MyClassPrivate;
class MyClass {
// interface methods
private:
MyClassPrivate *pimpl_;
};
d指針模式的宏集提供了一些排序方便性和一致性。例如,Q_DECLARE_PRIVATE可確保Foo的pimpl私有類被命名爲FooPrivate,FooPrivate可以與Foo匹配,並創建一個名爲d_func()的很好的內聯函數(const和nonconst版本)。後者用於Q_D宏,它基本上創建了一個指向私有類實例的作用域/局部變量d。
總之,您不需要使用Q_DECLARE_PRIVATE和其他宏,但這樣做會使代碼變得更簡潔,更清晰並且一致。
我認爲,d,指針其實只是實現了平普爾成語一些方便的宏。只需看看所有這些宏的定義:Q_D
,Q_Q
,Q_DECLARE_PRIVATE
等。它們只是pimpl部分的快捷方式。例如,大多數時候你想保留私人類中的原始類的引用。這裏有Q_Q
和Q_DECLARE_PUBLIC
。畢竟,使用宏迫使所有團隊實現統一的pimpl。否則有些人會打電話給私人指針d
,其他pimpl_
,想象一下這個爛攤子。
d指針是pimpl模式中的一個實現,其中有很多。它也是早期的實現之一:「」d-pointer「這個名字來自Trolltech的Arnt Gulbrandsen,他首先將這項技術引入到Qt中,使其成爲第一個C++ GUI庫,即使在更大版本之間也能保持二進制兼容性。「Source
使用宏的一個優勢是可以在編譯時在中心位置更改模式實現的某些實現細節。例如,你可以設計你的宏,讓你可以在不改變噸代碼的情況下在以後切換到fast pimpl implementation選項(希望如果你使用pimpl :-),你將不需要這個)。假設您在宏設計/實現中沒有犯錯......
但是,我個人建議避免使用pimpl實現的宏,因爲它們對您的源代碼樹中的任何新手都是神祕的。宏創建神奇的方言,這些方言通常容易出錯並且不像原始源代碼那樣有意義。他們還帶有與C預處理器相關的所有問題;它不知道底層語言。
我個人喜歡用我稱之爲d-reference的東西。而不是一個指針,你使用一個引用,你不必d-reference。 8-)看起來像這樣:
// MyClass.h
class MyClass
{
public:
MyClass();
~MyClass();
// implementation methods
private:
class MyClassPrivate& d;
};
// MyClass.cpp
struct MyClassPrivate
{
int x;
};
MyClass::MyClass()
: d(*new MyClassPrivate)
{
}
MyClass::~MyClass()
{
delete &d;
}
// In methods use d.x
很好,謝謝:) – 2016-07-12 02:35:35
「just pimpl」和d-pointers之間真的有區別麼?除了依靠宏來自動化工作。 – 2011-02-13 13:30:39