2012-03-03 55 views
2

我的家庭作业是告诉我要声明一个类内联,但我只听说过声明函数内联。内联类声明做了什么,以及如何实现它?你如何声明班级内联?

+0

你能发表整个问题吗?老实说,“内联课程”可能意味着不止一件事。比如,类中的类声明或者函数内的类声明(这两个都可以完成并且有用例)。 – StilesCrisis 2012-03-03 19:02:32

+0

@StilesCrisis“所有的表达式类声明必须出现在一个名为expressions.hh的头文件中(你应该在这个头文件中声明所有的类,因为这会让每个人的生活变得更容易)。” – 2012-03-03 19:03:20

+1

我想他们只是说你的类应该放在头文件中,为方便起见,所有的类方法都应该在类本身中内联声明,而不是将类方法放在线外或放入单独的CPP中。它有点含糊不清,但我就是这么解释它的。 – StilesCrisis 2012-03-03 19:05:25

回答

5

我认为他们只是说,你的类应该在标题中去,为方便起见,所有类方法应该在类中联声明,而不是把类方法外的线路或到一个单独的CPP。

这是有些不明确,但是这就是我想解释。

+3

我究竟如何解释它。但是,在上面的评论中“让每个人的生活变得容易”并不是一个经验法则。对于非常小的班级来说可能会更方便,但在大多数情况下并不适用。 – Correa 2012-03-03 19:10:59

2

比较函数和类:

一个函数可以有一个声明和一个定义:

​​

函数声明给出了所有的信息需要的人谁想要调用的函数。

函数定义允许编译器生成的机器代码,这样,当有人调用该函数会有说明在某个地方将要调用的可执行文件。

此生成的代码只在可执行文件中存在一次。通常你可以把函数定义放在一个.cpp文件中(或者如果你使用C语言,这也适用于C语言),它被编译并链接到可执行文件中。如果.cpp文件没有链接,你会得到一个链接器错误,说FunctionName not found或类似的东西。

如果你把函数定义在头文件就非常有可能的是,头会在你的系统中的多个地方使用,并纳入其他.cpp文件更多。这会在链接时FunctionName already defined in this, that, or the other object file产生相反的问题。

所以,平时没有在头文件中定义,因为头通常包括在多个cpp文件功能,以便最终将产生复制的对象代码。

然而,它有些不同。你有两种不同的方式来定义一个类的功能。一种方式是类似的运作方式上面的定义:

//myleanklass.h 
class MyLeanKlass 
{ 
public: 
    void perform(); 
}; 

//myleanklass.cpp 
void MyLeanKlass::perform() 
{ 
    // Sing, dance, and play the piano 
} 

正如自由函数我们可以把定义在头文件,只要它不超过一个.cpp文件包括。否则,我们会再次收到类似的链接器错误void MyLeanKlass::perform already defined ...尽管这种情况并不常见。您通常会声明类,以便可以通过系统重用它们。所以标题将被包含在多个地方并导致链接器错误。

只要是明确的,我们可能已经把在头文件中的定义,但不inline。您将无法在系统中多次包含此标头:

class MyLeanKlass 
{ 
public: 
    void perform(); 
}; 

void MyLeanKlass::perform() 
{ 
    // Sing, dance, and play the piano 
} 

最后,我们找到问题的答案。只要它们在类声明中,就可以在头文件中定义类函数。这被称为inline definition。即使头文件包含在多个.cpp文件中,也不会导致编译单元中存在多个定义,并且不会导致链接器错误。

//myleanklass.h 
class MyLeanKlass 
{ 
public: 
    void perform() 
    { 
     // Sing, dance, and play the piano 
    } 
}; 

不过,也有这种方法的问题:

  • 内联类的功能很可能使编译需要更长的时间,因为编译器仍将编译的类函数每重复定义,只有扔掉重复在链接时。
  • 更改类功能会导致重新编译包含它的任何.cpp文件,这又会导致更长的重新编译时间。
  • 有时候它是不可能的。如果一个类使用另一个类并且使用另一个类,那么您将有循环依赖,并且不可能定义所有内联。只需将问题函数放入单独的.cpp文件即可解决问题。