如果在头文件中有函数的内联定义,并且想要将函数定义体从标题移出到.cpp文件中,则不能只是将函数剪切并粘贴为它们在标题中定义;你必须转换语法:
class Foo
{
void method1() { definition(); }
void method2() { definition(); }
void method3() { definition(); }
};
对此:
void Foo::method1() { definition(); }
void Foo::method2() { definition(); }
void Foo::method3() { definition(); }
编辑:只是想指出我希望避免的是必须在每个方法名称前面输入类名。这似乎是一件小事,但当你将大量的函数定义移出标题并进入cpp文件时,它就会增加。当返回类型特别复杂时,你必须找到行中每个返回类型结束的位置,并且每个方法名称都开始。
所以我的问题是,我是否必须像上面的第二段代码那样做?如果我这样做会是什么(符合以下标准的C ++?):
在Foo.h中:
class Foo
{
void method1();
void method2();
void method3();
};
在Foo.cpp中:
#include "Foo.hpp"
class Foo
{
void method1() { definition(); }
void method2() { definition(); }
void method3() { definition(); }
};
答案 0 :(得分:5)
这不起作用:编译器会在重新定义类时看到这一点。我担心没有办法解决这个问题,这是语言的一部分。
[ps:我知道这些工作很乏味,但我们都必须在某个时间做这些工作。如果它是一项大工作,你可以考虑编写一个脚本来为你做这件事,但它真的必须是一个大工作来证明这个努力的合理性,解析C ++并不好玩]
答案 1 :(得分:2)
没有。我认为这违反了一个定义规则。无论如何,这是不允许的。请记住,编译器没有真正看到#include
。在将源提供给编译器之前处理include,因此编译器看到的内容类似于:
#line "foo.cpp" 1
#line "foo.h" 1
class Foo {
void method1();
...
};
#line "foo.cpp" 3
class Foo {
void method1() {...}
};
所以它看起来像是同一个符号的两个相互矛盾的定义。
答案 2 :(得分:1)
是的,你必须在顶部显示(原始代码)时这样做,我不认为它有一种懒惰的方式。
答案 3 :(得分:0)
您可以将类名放在原始定义中。这总是有效的。不幸的是,如果它被放入cpp文件中,你通常不会真正内联,除非它非常简单或你使用编译器指令。
如果它足够大,想要在大多数时间进入cpp,你不希望它内联。
另一件事是考虑'助手'类。在其他地方定义那些,它们执行了很多实现细节。然后你可以在派生类中调用它,它将被内联。