我的家庭作业是告诉我要声明一个类内联,但我只听说过声明函数内联。内联类声明做了什么,以及如何实现它?你如何声明班级内联?
回答
我认为他们只是说,你的类应该在标题中去,为方便起见,所有类方法应该在类中联声明,而不是把类方法外的线路或到一个单独的CPP。
这是有些不明确,但是这就是我想解释。
我究竟如何解释它。但是,在上面的评论中“让每个人的生活变得容易”并不是一个经验法则。对于非常小的班级来说可能会更方便,但在大多数情况下并不适用。 – Correa 2012-03-03 19:10:59
比较函数和类:
一个函数可以有一个声明和一个定义:
函数声明给出了所有的信息需要的人谁想要调用的函数。
函数定义允许编译器生成的机器代码,这样,当有人调用该函数会有说明在某个地方将要调用的可执行文件。
此生成的代码只在可执行文件中存在一次。通常你可以把函数定义放在一个.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文件即可解决问题。
- 1. PHP OOP声明班级
- 2. 你如何声明一个谓词委托内联?
- 3. 内联结构声明
- 4. 内联SQL更新声明
- 5. 如何在班级内访问我的班级变量?
- 6. 制作班级内的班级
- 7. 在班级内选择班级
- 8. 返回班级内的私人班级
- 9. 如何在另一个班级内使用CSS样式一个班级但不影响主班级班级
- 10. bash - 级联案例声明? (v。3.2.51)
- 11. 进入声明的级联/追加
- 12. 如何访问班级中的班级
- 13. 客户如何与我的班级图中的其他班级相关联?
- 14. 你如何阅读C声明?
- 15. 如何声明UIPageControl内
- 16. 内联的定义和声明
- 17. 当班级不真实时,班级内部是如何创建变量的?
- 18. 你用什么样式创建“班级”?
- 19. 如何在内联函数中声明一个静态变量?
- 20. 如何声明带内联函数的字典
- 21. 如何从内联声明中访问类实例?
- 22. 如何在Knockout中声明变量内联
- 23. 如何声明与全球级接入
- 24. Mysql高级声明
- 25. 你如何在Wollok创建一个班级?
- 26. 从另一个班级停止声音
- 27. 你如何让自己和你的同事创造巨大的班级
- 28. as3:如何组织班级
- 29. 如何“回显”班级?
- 30. 如何将一个班级应用到另一个班级?
你能发表整个问题吗?老实说,“内联课程”可能意味着不止一件事。比如,类中的类声明或者函数内的类声明(这两个都可以完成并且有用例)。 – StilesCrisis 2012-03-03 19:02:32
@StilesCrisis“所有的表达式类声明必须出现在一个名为expressions.hh的头文件中(你应该在这个头文件中声明所有的类,因为这会让每个人的生活变得更容易)。” – 2012-03-03 19:03:20
我想他们只是说你的类应该放在头文件中,为方便起见,所有的类方法都应该在类本身中内联声明,而不是将类方法放在线外或放入单独的CPP中。它有点含糊不清,但我就是这么解释它的。 – StilesCrisis 2012-03-03 19:05:25