2012-02-08 308 views
2

我真的很難將.cpp分割成.cpp和.h。C++如何正確地將.cpp分割成.cpp和.h

我以前使用過.h文件,但從未真正將.cpp分成.cpp和.h文件。

我知道.h文件僅用於聲明,.cpp用於定義,我試圖將.cpp分割成.cpp和.h但我得到很多錯誤,所以我想知道是否有人可以幫我用我的代碼。

以下類是尚未拆分爲.cpp和.h的類,只是爲了向您展示「之前的版本」。

TicketOrder.cpp

#include <iostream> 

using namespace std; 

class TicketOrder 
{ 

private : 

     char type; 
     int quantity; 

public : 

      friend std::ostream& operator<<(std::ostream& os, TicketOrder const& order) 
     { 
       os << " Type: " << order.type << ", Quantity: " << order.quantity; 
       return os; 
     } 


     //Getters 

     int getQuantity() const; 
     { 
         return quantity; 
     } 

     char getType() const; 
      { 
         return type; 
      } 

     //Setters  

     void setQuantity (int x) 
       { 
         quantity =x; 
       } 

     void setType(char y) 
       { 
         type =y; 
       } 
}; 

現在,我將分裂上面類放在.cpp和.H

TicketOrder.cpp

#include <iostream> 
#include "TicketOrder.h" 
using namespace std; 

class TicketOrder 
{ 

     //Getters 

     int getQuantity() const 
       { 
         return quantity; 
       } 

     char getType() const 
       { 
         return type; 
       } 

     //Setters 

     void setQuantity (int x) 
       { 
         quantity =x; 
       } 

     void setType(char y) 
       { 
         type =y; 
       }   
}; 

TicketOrder.h

#include <iostream> 

using namespace std; 

class TicketOrder 
{ 

private : 

     char type; 
     int quantity; 

public : 

      friend std::ostream& operator<<(std::ostream& os, TicketOrder const& order) 
     { 
       os << " Type: " << order.type << ", Quantity: " << order.quantity; 
       return os; 
     } 

     //Getters 

     int getQuantity() const;  
     char getType() const; 

     //Setters 

     void setQuantity (int x);  
     void setType(char y);  
}; 

我h另一個用於包含主類的另一個類,我不會在這裏包含它,因爲它很長,我不認爲這很重要,因爲我知道我在做.h和.cpp錯誤。

當我嘗試編譯爲主,它給了我這個錯誤:

Undefined      first referenced 
symbol        in file 
TicketOrder::getQuantity() const /var/tmp//ccaSflFG.o 
TicketOrder::setType(char)   /var/tmp//ccaSflFG.o 
TicketOrder::setQuantity(int)  /var/tmp//ccaSflFG.o 
ld: fatal: Symbol referencing errors. No output written to a.out 
collect2: ld returned 1 exit status 

誰能幫助我與分裂h和在.cpp?或者給我一些建議?我做了大量的研究,無法弄清楚什麼是錯的。

謝謝。

+1

1)使用一個簡單的例子,2)使用空格變得容易,3)不重複'TicketOrder'的聲明。 – Beta 2012-02-09 00:03:49

+1

該類的重複聲明會很好(那些看起來像'類TicketOrder;',但這裏我們有一個重複的*定義*。 – 2012-02-09 00:14:51

+0

@BenVoigt,你是對的,我站在糾正。 – Beta 2012-02-09 00:31:48

回答

4

您的.cpp文件是錯誤的,因爲重新聲明類,所以這是錯誤的。它應該是沿着線的東西:

#include <iostream> 
#include "TicketOrder.h" 
using namespace std; 

//Getters 
int TicketOrder::getQuantity() const 
{ 
    return quantity; 
} 
char TicketOrder::getType() const 
{ 
    return type; 
} 

//and so on 

另外請注意,在頭文件中添加using namespace,因爲你做的是,考慮非常不良作風。

+1

這是第二個*定義*的這個問題的類 – 2012-02-09 00:16:28

+0

嗨,大家好,我已經閱讀了你的建議,並拿出了重複的類定義,但是當我編譯它時,我仍然收到與上面發佈的錯誤相同的錯誤。在TicketOrder.cpp類中創建重複的類定義,任何人都可能知道這是怎麼回事?我不明白這個錯誤告訴我了什麼:/ – r1nzler 2012-02-09 00:25:31

+0

@ r1nzler,你試過跟隨rodrigo的例子嗎? – Beta 2012-02-09 00:33:29

2

你可以玩lzz,它自動完成這個。在默認模式下,它會向你顯示或多或少的事情。

0

羅德里戈已經解決了您的主要問題。我只想補充一些時尚點評:

  • 你不需要using namespace std,因爲你已經與std::前綴解決STD成員。在我看來,這是(幾乎)永遠是最好的解決方案,因爲using namespace X指令可以被包含你的.h文件的其他文件繼承。
  • 如果你真的想要使用using namespace std,將該指令放入你的類的中,這樣其他包含你的類的文件就不會擁有它。他們可能會定義具有std相同名稱的函數/類,如果上面有using namespace std指令,會導致編譯錯誤...
  • 您的.cpp文件不需要包含<iostream>,因爲它已經包含在標題中了......是的,<iostream>確實有一個標頭警衛,因此它不是真的包含兩次。但我認爲很高興不包括頭中已包含的內容......但也許這只是我的口味...... ;-)
1

如果你只是照顧這些小技巧,你可以非常成功地做到這一點

  1. 你的.cpp文件應該包含你的主要功能
  2. 你的.h文件中應包含頭文件
  3. 你的.cpp(即程序)應在頂部
  4. 聲明所有headerfile名
  5. 你的.h文件應包含在.h文件中的函數所需的任何其他headerfiles
  6. 當你編譯.h文件也可能會出現一些錯誤,但不英畝說。這是因爲它不包含主要功能。
+0

你能提供一個簡短的相關例子嗎?肯定會幫助... – NREZ 2013-09-06 12:37:03