2012-02-08 61 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