2016-08-25 74 views
1

我想只包含在.cpp文件中,因爲我在一個項目中需要很多需要彼此交互的類,而且我感覺它會更好一些既然你不必擔心你已經包含或不包含的內容,我只是不知道該怎麼做; 這裏有一個例子:只包含在cpp文件中

#include "UnitConverter.hpp" 
#include <string> 
//extern namespace std; 
//extern class std::string; 
//extern class UnitConverter; 
//extern enum UnitConverter::UnitTypes; 
//extern enum UnitConverter::UnitSystem; 
//extern enum UnitConverter::ScalingType; 

class AnalogOutput{ 

    public: 
    std::string name; 
    UnitConverter::UnitTypes unit_type; 
    UnitConverter::UnitSystem unit_system; 
    UnitConverter::ScalingType scaling_type; 
} 

我將如何申報命名空間,類和枚舉類型,使編譯沒有包括在HPP文件,但在cpp文件?

+3

我不清楚爲什麼要這樣做。 –

+4

爲什麼你擔心「你已經包含或不包含」?只要包括你需要的東西,如果你包含兩次相同的標題,那就是包括守衛的好處。 – user463035818

+1

你也可以轉發聲明一切,只使用指針和引用。但是,對於每個類都有自己的頭的分類包含系統看起來更清晰並且不會讓人頭疼。之後你也可以使用一些工具來檢查未使用的包含,以防你有太多的東西。 – Hayt

回答

2

std::string會讓你很難,因爲它是一個模板的typedef ...更好的不要擔心那個 - 你很可能會得到循環包含系統頭文件...

對於項目的課程,你必須精確地宣佈他們,因爲他們已經在其相應的頭被聲明:

// Example.h 
namespace Dummy 
{ 
    class Example { /* ... */ }; 
} 

然後以避免包括:

// Test.h 
namespace Dummy 
{ 
    class Example; // just the bare name! 
} 

但要注意,這樣,你會得到不完整的類型,而且你不能直接使用它們。您可以使用指針或對它們的引用,但以下組合不起作用:

// Test.h 
/* ... */ 
class Test 
{ 
    Dummy::Example ex; // type is incomplete! 
    Dummy::Example& ex_r; // reference is OK 
    Dummy::Example* ex_p; // pointer, too 

    inline void foo() 
    { 
     // type incomplete; you cannot do this here: 
     ex_p->bar(); 
     // needs to be done in cpp file where Example.h is included instead 
    } 
}; 
+0

Upvote前向聲明'std :: string'的困難 - 我沒有想到我自己... :) – atkins

+0

@atkins好像我們似乎應該已經寫了一個共同的答案在一起... – Aconcagua

+0

是的,謝謝很多傢伙,我想我會離開所需的包括在hpp文件,只是要小心。 @atkins – heczaco

6

您可以使用您自己包含您需要的所有東西的頭部來實現此目的。

使用全部標題將會終止編譯時間。厲害。別。做。它。

2

這聽起來像你在問關於使用forward declarations。要做到這一點,語法只是class MyClass;(你不需要那些extern前綴)。

並轉發申報駐留在命名空間中的一類,包裝在命名空間的向前聲明:

namespace MyNamespace { 
    class MyClass; 
} 

但是,至少有兩大注意事項在這裏與您的代碼片段:

  1. 您只能使用指針或引用到正向 聲明的類型。因此,在您的示例中,如果您希望AnalogOutput類中有std::string成員,則無法轉發聲明std::string - 您必須將該成員更改爲指針或引用。
  2. You can't forward declare nested types。因此,您將無法轉發聲明enums,因爲它們都嵌套在UnitConverter之內。
+0

upvote爲嵌套類型 - 我沒有想到我自己... – Aconcagua

相關問題