我对将 .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 吗?或者给我建议?我做了很多研究,但无法找出问题所在。
谢谢你。
您的 .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 不好的风格。
你可以玩lzz,它会自动执行此操作。在默认模式下,它会或多或少地向您显示事情通常去的地方。
只要注意以下几个提示,您就可以非常成功地做到这一点
罗德里戈已经解决了你的主要问题。让我添加一些风格评论:
using namespace std
,因为您已经使用 std::
前缀来寻址 std 成员。在我看来,这(几乎)总是最好的解决方案,因为 using namespace X
指令可以被包含 .h 文件的其他一些文件继承。using namespace std
,请将指令inside放置在您的类中,这样包含您的文件的其他文件就不会包含该指令。他们可能会定义与 std 名称相同的函数/类,如果上面有 using namespace std
指令,这会导致编译错误...using namespace X
。<iostream>
,因为它已经包含在标头中...是的,<iostream>
肯定有一个标头保护,所以它并没有真正包含两次。但我认为不包含标题中已包含的内容很好...但也许这只是我的口味...;-)