class A{
private:
std::string id;
public:
void f();
};
給出編譯時錯誤。但是,如果我在include <string>
的頂部,它編譯正確。不過,我不想在標題中使用include語句。我該怎麼做?包含在頭文件中
class A{
private:
std::string id;
public:
void f();
};
給出編譯時錯誤。但是,如果我在include <string>
的頂部,它編譯正確。不過,我不想在標題中使用include語句。我該怎麼做?包含在頭文件中
在這種情況下,您必須包含<string>
才能使用std::string
。
只有當您只使用標題中對象的引用或指針時,才能避免#including標題。在這種情況下,您可以使用前向聲明。但是since std::string is a typedef, you can't forward declare it,你必須包括它。
我確定你正試圖按照建議儘量少嘗試#include
,但在這種情況下你不能遵循它。
std :: string在標準名稱空間的<string>
頭文件中定義。你必須包括它。
您可能已經聽說在標頭中使用using namespace std;
是不明智的,因爲包含該標頭的任何內容都會與全局名稱空間中的所有內容緊密相連。包括你需要的頭文件是完全可以接受的。
將標題包含在其他標題中是完全必要的。儘可能減少它是明智的,但從根本上說,如果你的課程取決於std::string
,那麼你別無選擇,只能在#include <string>
的標題中找到答案。另外,取決於任何和/或所有標準類別絕對沒有錯 - 畢竟,它們被授權在任何實現中提供。這是using namespace std;
這是皺起了眉頭。
通過在包含其他頭文件之前在實現文件中包含必要的文件,即確保#include <string>
出現在實現文件(.cpp)的第一行,然後包含您自己的頭文件文件。
這不完全是最佳做法。所有的頭文件都應該滿足它們自己的依賴關係,所以頭文件的用戶不需要關心依賴關係。至少這是我的愚見。
不幸的是,你無法繞過它。
即使你的類定義是這樣的:
class A {
private:
std::string* id;
public:
void f();
};
那麼還是有沒有什麼你可以做,如前宣佈std::basic_string<char, etc>
是一個痛苦的屁股。我甚至不打算演示。
幸運的是,雖然頭文件中的using namespace std
是一個明確的禁忌,但您通常可以在標頭中使用標準頭文件,而不用擔心它。
只要您知道,如果您使用內聯markdown語法,則可以確保代碼示例不會被解釋爲HTML,因爲括號中的內容。用反引號('\'')來包圍這個短語。 – 2011-05-22 16:10:52
@Cody Gray:非常感謝!我不知道。 – 2011-05-22 20:09:22