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

问题描述 投票:0回答:4

我对将 .cpp 拆分为 .cpp 和 .h. 非常陌生

我以前使用过 .h 文件,但从未真正将 .cpp 拆分为 .cpp 和 .h。

我知道 .h 文件仅用于声明,.cpp 用于定义,我尝试将 .cpp 拆分为 .cpp 和 .h 但出现了很多错误,所以我想知道是否有人可以帮助我用我的代码。

下面的类是还没有被分割成.cpp和.h的类,只是为了向大家展示“之前的版本”。

票务订单.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

票务订单.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;
                }        
};

票务订单.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。

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

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 吗?或者给我建议?我做了很多研究,但无法找出问题所在。

谢谢你。

c++
4个回答
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
(正如您所做的那样)被认为是 very 不好的风格。


2
投票

你可以玩lzz,它会自动执行此操作。在默认模式下,它会或多或少地向您显示事情通常去的地方。


1
投票

只要注意以下几个提示,您就可以非常成功地做到这一点

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

1
投票

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

  • 您不需要
    using namespace std
    ,因为您已经使用
    std::
    前缀来寻址 std 成员。在我看来,这(几乎)总是最好的解决方案,因为
    using namespace X
    指令可以被包含 .h 文件的其他一些文件继承。
  • 如果您确实想使用
    using namespace std
    ,请将指令inside放置在您的类中,这样包含您的文件的其他文件就不会包含该指令。他们可能会定义与 std 名称相同的函数/类,如果上面有
    using namespace std
    指令,这会导致编译错误...
    你不能在类范围内执行
    using namespace X
  • 你的.cpp文件不需要包含
    <iostream>
    ,因为它已经包含在标头中...是的,
    <iostream>
    肯定有一个标头保护,所以它并没有真正包含两次。但我认为不包含标题中已包含的内容很好...但也许这只是我的口味...;-)
© www.soinside.com 2019 - 2024. All rights reserved.