2015-07-21 55 views
0

我對C++ 11還是個新手。什麼C++習語/模式是這樣的

前段時間我問以下問題:
Best method to implement an abstract factory pattern

爲了研究更多一些,我想知道這是什麼C++成語的名稱。

這裏我稱它爲pimpl,但我不確定這是否是正確的名稱。

整個事情的目的是在從工廠返回Shape對象時隱藏原始指針或智能指針。使用這個「模式」工廠將能夠返回一個和相同的類型,具體的實現將被封裝在對象內部。

它也非常類似於decorator,除非它不裝飾任何東西。

除了外部接口與「內部」接口相同之外,人們也可以發現類似於adapter

class PimplShape : public Shape{ 
    Shape *sh; 
public: 
    PimplShape(Shape *sh) : sh(sh){ 
    } 

    virtual ~PimplShape() override{ 
     delete sh; 
    } 

    virtual void process() override { 
     sh->process(); 
    } 
}; 
+1

「從工廠返回Shape對象時」這是如何完成的?您沒有方法返回包含的Shape。而且,這將創建一個完整的Shape,它本身必須包含指向另一個Shape的指針。我不確定那是你想要的,是嗎?似乎對我來說是多餘的。 –

+0

http://stackoverflow.com/questions/31494734/best-method-to-implement-an-abstract-factory-pattern - 檢查這一點。如果使用這種方式,工廠將始終返回一個和相同的類型。具體的實現將被封裝在這種類型中。 – Nick

+4

你的班級做的那個unique_ptr不是什麼? – Pumkko

回答

1

我個人認爲你已經在多種成語之間做了一些東西。

pimpl的想法是隱藏提供實際功能的內部類,以便您可以根據需要更改而不會影響用戶(Qt廣泛地這麼做)。如果我們看看你的代碼,有兩件事情比禁止它 - 繼承和方法在類定義中實現的事實(所以內部類的方法對類的用戶是可見的)。在你區分正確的pimpl是:

// PimplShape.h 
class Shape; 

class PimplShape 
{ 
    Shape *sh_; 
public: 
    PimplShape(Shape *sh); 
    ~PimplShape(); 
    void process(); 
}; 

// PimplShape.cpp 
#include "Shape.h" // Defines Shape::process() so PimplShape can use it 

PimplShape::PimplShape(Shape *sh) : sh_(sh) 
{ 

} 

PimplShape::~PimplShape() 
{ 
    delete sh_; 
} 

void PimplShape::process() 
{ 
    sh_->process(); 
} 

正如你可以在這裏看到,該Shape類是從PimplShape.h文件的任何用戶隱藏。

如果我們從功能的角度來看你的例子,似乎你想實現CRTP,但這不是做到這一點的方法。

+0

我不認爲這是典型的Pimpl模式的「impl」是一個抽象類(我從Nick的另一個問題的背景知道'Shape'是一個抽象類)。你通常不需要隱藏抽象類。 –

+0

@ChrisDrew這只是爲了說明'pimpl'看起來像給定的代碼示例,這樣Nick就可以看到區別:)正如我所說的,他似乎是在許多成語之間存在的東西,所以應該有一些澄清至於他試圖達到的目標是什麼。 –