2011-05-22 186 views
4
class A{ 
private: 
    std::string id; 
public: 
    void f(); 
}; 

給出編譯時錯誤。但是,如果我在include <string>的頂部,它編譯正確。不過,我不想在標題中使用include語句。我該怎麼做?包含在頭文件中

回答

10

在這種情況下,您必須包含<string>才能使用std::string

只有當您只使用標題中對象的引用或指針時,才能避免#including標題。在這種情況下,您可以使用前向聲明。但是since std::string is a typedef, you can't forward declare it,你必須包括它。

我確定你正試圖按照建議儘量少嘗試#include,但在這種情況下你不能遵循它。

+0

只要您知道,如果您使用內聯markdown語法,則可以確保代碼示例不會被解釋爲HTML,因爲括號中的內容。用反引號('\'')來包圍這個短語。 – 2011-05-22 16:10:52

+0

@Cody Gray:非常感謝!我不知道。 – 2011-05-22 20:09:22

2

std :: string在標準名稱空間的<string>頭文件中定義。你必須包括它。

-2

可能有些瘋狂的extern聲明會有所幫助,但這不是一種方法。你爲什麼不想包含在頭文件中?

+0

其實它很好,但我聽到這樣的方式是不推薦。 – thetux4 2011-05-22 13:21:12

+0

不建議使用'using namespace std'和類似的命令。你可以在你的頭文件中包含任何頭文件,它不會造成任何麻煩。 – 2011-05-22 13:23:59

+0

包含'.c'和'.cpp'是錯誤的,沒有包含警衛會導致錯誤,如果它包含兩次,但在這裏都不適用。您使用它,您需要聲明 - 該聲明位於標題中。期。 – delnan 2011-05-22 13:24:28

1

您可能已經聽說在標頭中使用using namespace std;是不明智的,因爲包含該標頭的任何內容都會與全局名稱空間中的所有內容緊密相連。包括你需要的頭文件是完全可以接受的。

11

將標題包含在其他標題中是完全必要的。儘可能減少它是明智的,但從根本上說,如果你的課程取決於std::string,那麼你別無選擇,只能在#include <string>的標題中找到答案。另外,取決於任何和/或所有標準類別絕對沒有錯 - 畢竟,它們被授權在任何實現中提供。這是using namespace std;這是皺起了眉頭。

2

通過在包含其他頭文件之前在實現文件中包含必要的文件,即確保#include <string>出現在實現文件(.cpp)的第一行,然後包含您自己的頭文件文件。

這不完全是最佳做法。所有的頭文件都應該滿足它們自己的依賴關係,所以頭文件的用戶不需要關心依賴關係。至少這是我的愚見。

1

不幸的是,你無法繞過它。

即使你的類定義是這樣的:

class A { 
private: 
    std::string* id; 
public: 
    void f(); 
}; 

那麼還是有沒有什麼你可以做,如前宣佈std::basic_string<char, etc>是一個痛苦的屁股。我甚至不打算演示。

幸運的是,雖然頭文件中的using namespace std是一個明確的禁忌,但您通常可以在標頭中使用標準頭文件,而不用擔心它。