2013-02-27 79 views
-1

我在學習C++的階段。在閱讀C++ Object模型時,我瞭解了不同的對象模型。C++對象模型的缺點。解決辦法是什麼?

1)簡單對象模型。

2)表驅動對象模型。

3)C++對象模型。

問題:

它的主要缺點是需要重新編譯未修改代碼,使用一個類的一個對象,其出現了添加,移除,或非靜態類數據的修改的需要

我明白了上述說法。在類定義中發生的任何更改,然後 使用相同類的源代碼需要重新編譯。

這意味着,有一些爲什麼實現相同,而無需重新編譯也。怎麼做?如果有人提供了很好的示例代碼。我在Linux/Ubuntu中使用g ++。

+5

您的問題不清楚,但您可能正在尋找[pimpl idiom](http://www.gotw.ca/publications/mill04.htm)。 – 2013-02-27 12:41:12

回答

1

有可能的方式來實現在其他語言/對象模型一樣,但不是在C++。否則,這不會是C++對象模型的缺點。

然而,可以減輕後果,例如,通過(1)從庫中僅導出a.k.a.純粹抽象類的接口和(2)不改變已發佈的接口。如果必須添加新的API,請通過新界面導出它(即使它是指舊的/修改的實施類)。

我不確定代碼示例會有多大幫助。這不是一種編碼技術。如果你知道什麼是一個純粹的抽象類,那麼你就是一切。

0

請注意,在頭文件中公開實現細節可能具有優勢,以及在細節更改時強制重新編譯的缺點;函數可以更容易內聯,這可以提高運行時性能。您需要決定何時何地進行折衷是值得的。

通過引入額外的間接級別,可以隱藏源文件中的所有私有實現細節。一種常見的方法是將指針到私人的實現(或「平普爾」)成語,例如:

// Header file 
class Thing { 
public: 
    Thing(...); 
    ~Thing(); 

    // Public interface 

private: 
    struct Impl; 
    std::unique_ptr<Impl> impl; 
}; 

// Source file 
struct Thing::Impl { 
    // private details 
}; 

Thing(...) : impl(new Impl(...)) {} 
~Thing() {} 

// Implementation of public interface 

另一種可能性是定義一個抽象的接口,具有一個或多個工廠創建包含具體實例實現,例如:

// Header file 
class Thing { 
public: 
    virtual ~Thing() {} 

    static std::unique_ptr<Thing> make(...); 

    // Pure virtual public interface 
}; 

// Source file 
class ThingImpl : public Thing { 
    // Implementation of public interface 

    // Private implementation details 
}; 

std::unique_ptr<Thing> Thing::make(...) { 
    return std::unique_ptr<Thing>(new ThingImpl(...)); 
} 

這些方法都將所有的實現細節源文件中,所以這是一個需要在細節改變重新編譯的唯一的事情。但是都會引入額外的指針間接和/或間接的函數調用,這可能會影響運行時性能。

相關問題