2009-12-08 84 views
0

如果您在头文件中内联定义了函数,并且想要将函数定义主体移出标题并移至.cpp文件中,则不能只按照原样剪切和粘贴函数在标题中定义;你必须从这个语法转换:在.cpp文件中,用“class Foo {void method(){}}”定义方法;“而不是“void Foo :: method(){}”?

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(); } 
}; 

回答

5

这不起作用:编译器会在您重新定义类时看到此内容。恐怕没有办法解决这个问题,这是语言的一部分。

[ps:我知道这些工作很乏味,但我们都必须这样或那样做。如果是这么大的工作,你可以看看写一个脚本来为你做,但它真的必须是一个工作,以证明imho的努力,解析C++是不好玩的]

+4

“我知道,我会用正则表达式!” – 2009-12-08 01:43:28

+0

@anon:... LOL:D – jkp 2009-12-08 01:44:44

+3

“然后我遇到了两个问题!” – KeithB 2009-12-08 02:11:06

2

号我认为,这违反了一个定义规则。无论如何,这是不允许的。请记住,#include不是真的被编译器看到的。在包括源被送到编译器之前经过处理,以编译器看到的是一样的东西:

#line "foo.cpp" 1 
#line "foo.h" 1 
class Foo { 
    void method1(); 
    ... 
}; 

#line "foo.cpp" 3 
class Foo { 
    void method1() {...} 
}; 

所以看起来相同符号的两个相互矛盾的定义。

1

是你必须这样做,因为你显示在顶部(你的原始代码),我不认为有一种懒散的方式。

0

您可以将类名称放在原始定义中。这总是有效的。不幸的是,对于内联而言,如果它被放入cpp文件中,通常不会再真正进行内联,除非它非常简单或者使用编译器指令。

如果它的大小足以让你在大部分时间内转入cpp,但你不希望它被内联。

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

相关问题