c ++如何正确地将.cpp拆分为.cpp和.h

时间:2012-02-08 23:59:19

标签: 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和.cpp错误。

当我尝试编译main时,它给了我这个错误:

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吗?或者给我一些建议?我做了很多研究,无法弄清楚是什么问题。

谢谢。

4 个答案:

答案 0 :(得分: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 :(得分:2)

您可以使用lzz,它会自动完成此操作。在它的默认模式下,它会或多或少地显示通常的位置。

答案 2 :(得分:1)

如果你只是处理这些小提示,你可以非常成功地完成这项工作

  1. 您的.cpp文件应包含您的主要功能
  2. 您的.h文件应包含头文件
  3. 你的.cpp(即你的程序)应该在顶部声明所有头文件名
  4. .h文件应包含.h文件中函数所需的任何其他标题文件
  5. 当您编译.h文件时,它可能会显示一些错误,但不会出现这种情况。这是因为它不包含主要功能。

答案 3 :(得分:0)

罗德里戈已经解决了你的主要问题。让我加上一些风格评论:

  • 您不需要using namespace std,因为您已经使用std::前缀对std成员进行了寻址。在我看来,这几乎总是最好的解决方案,因为using namespace X指令可以被包含.h文件的其他文件继承。
  • 如果您真的想使用using namespace std,请将该指令放在您的类中,以便包含您的其他文件不会拥有它。他们可能会定义与std相同名称的函数/类,如果上面有using namespace std指令,则会导致编译错误。
  • 你的.cpp文件不需要包含<iostream>,因为它已经包含在标题中......是的,<iostream>肯定有一个标题保护,所以它实际上不包括两次。但是我认为不包括已经包含在标题中的内容很好......但也许这只是我的口味...; - )