2016-08-25 149 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

相关问题