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

C++ c++;如何正确地将.cpp拆分为.cpp和.h,c++,C++,我对将.cpp分解为.cpp和a.h非常陌生 我以前使用过.h文件,但从未真正将.cpp拆分为.cpp和.h 我知道.h文件只用于声明,.cpp文件用于定义,我尝试将.cpp文件拆分为.cpp文件和.h文件,但我遇到了很多错误,所以我想知道是否有人可以帮助我编写代码 下面的类还没有被划分为.cpp和.h,只是为了向大家展示“之前的版本” TicketOrder.cpp #include <iostream> using namespace std; class TicketOrd

我对将.cpp分解为.cpp和a.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;
                }   
};
#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和.cpp吗?或者给我一些建议?我做了很多研究,但不知道出了什么问题


谢谢。

您的.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
#包括
#包括“TicketOrder.h”
使用名称空间std;
//吸气剂
int TicketOrder::getQuantity()常量
{
退货数量;
}
char tickerder::getType()常量
{
返回类型;
}
//等等

另外,请注意,在头文件中添加使用命名空间的
(正如您所做的那样)被认为是非常糟糕的样式。

您可以使用它,它会自动执行此操作。在默认模式下,它会或多或少地向您显示事情通常会发生的情况。

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

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

  • .cpp文件应包含主函数
  • .h文件应包含头文件
  • 您的.cpp(即您的程序)应在顶部声明所有标题文件名
  • 您的.h文件应包含.h文件中函数所需的任何其他头文件
  • 编译.h文件时,可能会显示一些错误,但请不要这样做。这是因为它不包含主功能。

  • 1) 举个简单的例子,2)不要使用空格,3)不要重复
    TicketOrder
    的声明。重复类的声明就可以了(这些看起来像
    类TicketOrder;
    ,但这里有一个重复的定义。@BenVoigt,你说得对,我得到了更正。这是类的第二个定义,这是问题所在。大家好,我已经阅读了你的建议并删除了重复的类定义,但是当我编译它时,我仍然收到与我在上面发布的错误。我唯一更改的是删除TicketOrder.cpp类中的重复类定义。任何人都可能知道发生了什么事?我不明白这个错误告诉了我什么。//r1nzler,你有没有尝试遵循rodrigo的示例?@r1nzler:我想这意味着你编译了
    .h
    文件,而不是
    .cpp
    (其中包括
    .h
    )。也可能是您在编译实际应用程序时尝试使用TicketOrder,但没有为编译器指定TicketOrder.o对象。您通常会使用类似于
    g++-o app app.cpp TicketOrder.o
    (用于GNU编译器)这样,当链接“app”时,这些未定义符号的实现是可用的。
    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
    
    #include <iostream>
    #include "TicketOrder.h"
    using namespace std;
    
    //Getters
    int TicketOrder::getQuantity() const
    {
        return quantity;
    }
    char TicketOrder::getType() const
    {
        return type;
    }
    
    //and so on