2009-12-08 95 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,但你不希望它被內聯。

另一件事是考慮'助手'類。定義那些在其他地方,這些做了很多的實施細節。然後你可以在派生類中調用它,它將被內聯。

相關問題