2010-12-06 220 views
2

大約14年前,我編寫了一些C++。我熟悉.NET等與我一起工作的大多數新技術。爲什麼在創建新的C++類時創建了兩個文件(.h和.cpp)?

現在,我正在編寫一個simlpe電話列表Windows應用程序,我想使它成爲C++,這樣我可以更好地查看C#和C++的區別。

讓我說,我已經注意到了一個區別! Hehehe ...因此,這些區別之一是,當從Visual Studio模板創建一個新的C++類時,它不僅會創建.cpp類文件,還會創建一個頭文件。

這是爲什麼?爲什麼要爲一個類創建一個class1.h和一個class1.cpp文件?

我記得頭文件可能是函數和對象的庫,如果我們可以這樣說,爲了將來的重用,我記得沒有錯嗎?

問題

  1. 爲什麼有兩個文件(.H和.cpp)添加一個新的C++類時產生的?
  2. 我應該在頭文件中定義成員並在cpp文件中定義函數核心嗎?
  3. 如果不是2,那麼這個特定場景中的頭文件是什麼?

編輯#1

然後應我的代碼是這樣的?

// Customer.h header file 
ref class Customer { 
    private: 
     char* _number, _name; 
     long _phoneNumber; 

    public: 
     char[] get_number(); 
     void set_number(char* number); 
     char[] get_name(); 
     void set_name(char* name); 
     long get_phoneNumber(); 
     void set_phoneNumber(long phoneNumber); 
     void set_name(char* name); 
} 

然後:

// Customer.cpp 
#include <Customer.h> 

char[] Customer::get_number() { 
    return _number; 
} 

void Customer::set_number(char* number) { 
    if (number != null && sizeof(number) < 1) return; 
    _number = number; 
} 

// And the other members here... 

現在我知道,有大部分是很多在我的代碼錯誤。如果你幫我糾正錯誤,我會很高興,這樣我就可以提高我的C++技能。

感謝您幫助我找出答案。

+1

這是C++/CLI - 你想使用本機C++還是託管C++代碼?有很大的不同。 – 2010-12-06 20:31:42

+0

@Steve:謝謝你向我指出這一點。其實我不能說。我猜想原生C++對我來說更適合在C++中充分使用,這樣我就可以快速啓動並運行,從而有效地開發應用程序,對嗎?還是值得的? – 2010-12-06 20:43:14

回答

2

C++中的函數和類必須在使用之前聲明,這只是一個聲明,聲明可以從這個文件使用這些函數。這些聲明是使用頭文件導入的(.hpp/.h文件)。

要聲明一個功能,你可以寫成這樣:

return typefunction name(arguments);

所以這個功能:

int factorial (int x) 
{ 
    if (x == 0) 
    return 1; 
    return x * factorial (x - 1); 
} 

會預先聲明像這樣:

int factorial (int x); 

聲明的類是這樣的:

classclass name{function and variable declarations};

所以class Foo與方法bar和公共成員變量baz應該是這樣的:


foo.hpp:

#ifndef FOO_HPP_ 
#define FOO_HPP_ 

class Foo 
{ 
public: 
    int baz; 

    void bar(); 
}; 

#endif 

foo.cpp:

#include "foo.hpp" 
#include <iostream> 

void Foo::bar() 
{ 
    std::cout << baz << std::endl; 
} 
1

類在頭文件中聲明,大多數功能在.cpp文件中定義。該工具正在幫助您完成接口與實施的分離。

考慮報頭和cpp文件之間的分離的方法是:

  • 集管包含由其他文件一起使用聲明。
  • .cpp文件包含實現。

原因是你想要很多文件能夠利用功能,但你只想實際定義在一個地方的功能。

1

頭文件聲明/定義一個類。它包含成員函數,成員數據,朋友等。通常,它不包含很多(如果有的話)實現(模板是例外)。

執行文件(* .cpp)就是這樣的:它們實現了這個類。你不需要使用實現文件(如果你告訴VS嚮導你想創建一個內聯類,它只會創建頭文件),但通常這隻能用於模板類(例如STL類和boost庫中的許多類)或非常簡單的類。

1

C++編譯需要頭文件,因爲它與C#幾乎沒有區別。

在C#中,二進制模塊之間的鏈接始終是動態的。在C++中,靜態和動態鏈接有所不同。爲了詳細說明,我需要整整一小時的寫作,但讓我們說這是最短的方法。

在C++中,每個.cpp文件都被分別編譯到一個目標文件中。該文件需要鏈接到其他人才能形成一個二進制文件。頭文件聲明瞭包含它的.cpp文件所需的所有方法簽名,該文件是調用爲該類定義的方法的文件。

在C#中,所有文件都被編譯成一個二進制文件,即。編譯器總是知道正在編譯的成員可以看到哪些類和方法。

相關問題