在.cpp文件中,使用“class Foo {void method(){}};”定义方法而不是“void Foo :: method(){}”?

时间:2009-12-08 01:34:06

标签: c++

如果在头文件中有函数的内联定义,并且想要将函数定义体从标题移出到.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(); }
};

4 个答案:

答案 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,你不希望它内联。

另一件事是考虑'助手'类。在其他地方定义那些,它们执行了很多实现细节。然后你可以在派生类中调用它,它将被内联。