[英]Forward declaration of a method return type
假設我有以下課程:
foo.h中:
class MyVectorClass;
class Foo {
public:
MyVectorClass get();
...
}
按照共同商定的模式轉發聲明可以向前聲明的所有內容,並且由於MyVectorClass
僅用作方法的返回類型,因此MyVectorClass
是前向聲明的。 然后,此類的任何用戶都應該包含MyVectorClass.h
以便能夠使用方法get
。
Bar.cpp:
#include "Foo.h"
#include "MyVectorClass.h"
Foo foo;
...
MyVectorClass result = foo.get();
事實上,為了使用類Foo
我們需要包含一些額外的標題,這讓我質疑這里的前向聲明的想法。 如果我使用auto而不是MyVectorClass
,這對我來說更加令人困惑,因為我並不太關心MyVectorClass
,所以帶有類似矢量的界面的東西對我來說已經足夠了。
#include "Foo.h"
#include "MyVectorClass.h"
Foo foo;
...
auto result = foo.get();
閱讀此代碼時,很難找到為什么包含MyVectorClass.h
。 當Foo
的接口發生變化,並且get
開始返回AnotherVectorClass
或std::vector
,我們應該在get方法的每個用戶中刪除舊的MyVectorClass.h
並改為包含一個合適的新頭。
前瞻性聲明真的值得嗎?
我認為問題是說任何可以向前宣布的東西應該是。 前向聲明在編譯速度方面提供了好處,但是以便利性為代價。
一個例子是你給的那個。 另一個原因是,甚至IDE和工具(例如VisualAssist)有時也不知道如何制作前向聲明,並且無法跳轉到實際類型。 重構工具也是如此。
所以值得與否的問題取決於編譯速度的提高是否值得。
如果你想給這個類的用戶提供稍微好一點的提示,還有另外一個選擇:你可以在“Foo.inl”文件中包含它的所有依賴項,用戶需要包含它才能安全地使用它,而不是非常麻煩,並且以更加面向未來的方式。
同樣, auto
是靜態類型的,不會幫助您獲得所需的動態多態性。 如果需要,可以使用迭代器或指針。
因此,這里的一個解決方案是從同一個基類繼承所有SomeVector
實現類,這樣您就不必擔心每次更改內容時都要編輯包含。
或者,如果MyVectorClass
具有適當的迭代器,您可以使用get()
為您提供的MyVectorClass
,並且根本不使用中間的SomeVector
類型。 這對你的情況更好,因為你也可以使用stl向量本身。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.