簡體   English   中英

前向聲明方法返回類型

[英]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開始返回AnotherVectorClassstd::vector ,我們應該在get方法的每個用戶中刪除舊的MyVectorClass.h並改為包含一個合適的新頭。

前瞻性聲明真的值得嗎?

我認為問題是說任何可以向前宣布的東西應該是。 前向聲明在編譯速度方面提供了好處,但是以便利性為代價。

一個例子是你給的那個。 另一個原因是,甚至IDE和工具(例如VisualAssist)有時也不知道如何制作前向聲明,並且無法跳轉到實際類型。 重構工具也是如此。

所以值得與否的問題取決於編譯速度的提高是否值得。

如果你想給這個類的用戶提供稍微好一點的提示,還有另外一個選擇:你可以在“Foo.inl”文件中包含它的所有依賴項,用戶需要包含它才能安全地使用它,而不是非常麻煩,並且以更加面向未來的方式。

同樣, auto是靜態類型的,不會幫助您獲得所需的動態多態性。 如果需要,可以使用迭代器或指針。

因此,這里的一個解決方案是從同一個基類繼承所有SomeVector實現類,這樣您就不必擔心每次更改內容時都要編輯包含。

或者,如果MyVectorClass具有適當的迭代器,您可以使用get()為您提供的MyVectorClass ,並且根本不使用中間的SomeVector類型。 這對你的情況更好,因為你也可以使用stl向量本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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