2012-03-03 57 views
2

我的家庭作業是告訴我要聲明一個類內聯,但我只聽說過聲明函數內聯。內聯類聲明做了什麼,以及如何實現它?你如何聲明班級內聯?

+0

你能發表整個問題嗎?老實說,「內聯課程」可能意味着不止一件事。比如,類中的類聲明或者函數內的類聲明(這兩個都可以完成並且有用例)。 – StilesCrisis 2012-03-03 19:02:32

+0

@StilesCrisis「所有的表達式類聲明必須出現在一個名爲expressions.hh的頭文件中(你應該在這個頭文件中聲明所有的類,因爲這會讓每個人的生活變得更容易)。」 – 2012-03-03 19:03:20

+1

我想他們只是說你的類應該放在頭文件中,爲方便起見,所有的類方法都應該在類本身中內聯聲明,而不是將類方法放在線外或放入單獨的CPP中。它有點含糊不清,但我就是這麼解釋它的。 – StilesCrisis 2012-03-03 19:05:25

回答

5

我認爲他們只是說,你的類應該在標題中去,爲方便起見,所有類方法應該在類中聯聲明,而不是把類方法外的線路或到一個單獨的CPP。

這是有些不明確,但是這就是我想解釋。

+3

我究竟如何解釋它。但是,在上面的評論中「讓每個人的生活變得容易」並不是一個經驗法則。對於非常小的班級來說可能會更方便,但在大多數情況下並不適用。 – Correa 2012-03-03 19:10:59

2

比較函數和類:

一個函數可以有一個聲明和一個定義:

​​

函數聲明給出了所有的信息需要的人誰想要調用的函數。

函數定義允許編譯器生成的機器代碼,這樣,當有人調用該函數會有說明在某個地方將要調用的可執行文件。

此生成的代碼只在可執行文件中存在一次。通常你可以把函數定義放在一個.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文件即可解決問題。