2011-04-30 84 views
3

我有一個Mammal.h文件,上面寫着:我應該同時使用頭文件和cpp /源文件嗎?

#ifndef MAMMAL_H 
#define MAMMAL_H 

class Mammal 
{ 
public: 
    void Speak(); 
}; 

#endif 

我CPP文件看起來像:

#include "stdafx.h" 
#include "Mammal.h" 
#include <iostream> 

void Mammal::Speak() 
{ 
    using namespace std; 

    cout << "Speaking"; 
} 

而且我利用這個代碼是在這裏看到:

#include "stdafx.h" 
#include "Mammal.h" 

int main() 
{ 
    Mammal *mammal = new Mammal(); 

    mammal->Speak(); 
} 

然而,我可能做到這一點在頭文件中:

#include "stdafx.h" 
#include <iostream> 

#ifndef MAMMAL_H 
#define MAMMAL_H 

class Mammal 
{ 
public: 
    void Speak() 
    { 
     using namespace std; 

     cout << "Speaking"; 
    } 
}; 

#endif 

我還沒有真正定義偏好...但我確實看到這兩個工作。這兩種方法都有優點還是缺點?

+1

請將代碼放在問題 – 2011-04-30 05:04:57

+0

我非常但是,當我試圖這樣做時,結果很糟糕。所以爲了別人的利益,我使用了pastebay。我同意你的觀點,即代碼應該在問題中(絕對是最簡單的)。但是我覺得你可能不會欣賞一些粗體粗體的文本,其他的不是,一些斜體等等。 – 2011-04-30 05:09:49

+0

@icktoofay:謝謝! – 2011-04-30 05:13:05

回答

3

嘗試從多個位置調用該代碼 - 因此#包括多個源文件中的標頭 - 並且您將在第二種方法中看到問題。如果你有同一個函數的多個定義,即使它們是相同的,鏈接器也不喜歡它。

2

在頭文件包含在多個文件中時,在頭文件中定義函數的Beta版是正確的。

我還建議您將標題和實現分開爲單獨的文件,只是一個很好的編碼實踐。頭文件表示類的「接口」。公共函數是類的用戶可以使用的,頭文件提供了一種簡潔的方式讓人們看到函數而不必關心實現。另外,這樣可以在不影響呼叫者的情況下更改實現,因爲它們只包含標題,而實現通常只是一個鏈接的庫。