簡體   English   中英

智能指針是否違反了最小化頭文件中#includes的原則?

[英]Do smart pointers break the principle of minimizing #includes in header files?

我更喜歡在我的頭文件中最小化#include的使用,盡可能使用前向聲明,我相信這被認為是一種很好的做法。

如果我有一個方法聲明,它的效果很好:

bool IsFlagSet(MyObject *pObj);

但是,如果我在MyObject.htypedef 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM