![](/img/trans.png)
[英]How do I implement the Interface Segregation Principle using smart pointers in C++?
[英]Do smart pointers break the principle of minimizing #includes in header files?
我更喜歡在我的頭文件中最小化#include
的使用,盡可能使用前向聲明,我相信這被認為是一種很好的做法。
如果我有一個方法聲明,它的效果很好:
bool IsFlagSet(MyObject *pObj);
但是,如果我在MyObject.h
有typedef Ptr<MyObject> MyObjectPtr
MyObject.h
並且API更改為:
bool IsFlagSet(MyObjectPtr pObj);
我現在不必 #include "MyObject.h"
嗎? 有沒有辦法解決這個問題,還是僅僅是使用智能指針付出的代價?
不,你不必。 您可以為不完整的類定義類型別名,模板參數可以是不完整的類型(請參閱C ++ 11標准的第14.3.1 / 2段):
#include <memory>
struct C;
typedef std::shared_ptr<C> ptrC; // C is incomplete here
struct C { void foo() { } };
int main()
{
ptrC p = std::make_shared<C>();
p->foo();
}
正如Pubby在注釋中正確提到的那樣 ,函數聲明不要求其簽名中提到的類型完成:
struct C;
void foo(C); // C is incomplete here
struct C { };
#include <iostream>
void foo(C)
{
std::cout << "foo(C)" << std::endl;
}
int main()
{
C c;
foo(c);
}
不, std::shared_ptr<T>
明確設計為在T
僅向前聲明時工作。 當然,這並不適用於所有情況,但原理與普通指針相同。 如果T
是向前聲明的,你可以用std::shared_ptr<T>
做任何你可以用T*
做的事情。
你可以使用不完整類型的typedef。
但是使用智能指針類型的全名是不是更好?
MyClassPtr
當然要短得多,但是std::unique_ptr<MyClass>
實際上告訴我們如何使用這個指針。 因此,對於不長的名稱,我建議使用智能指針的全名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.