我真的很擅长将.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吗?或者给我一些建议?我做了很多研究,无法弄清楚是什么问题。
谢谢。
答案 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)
如果你只是处理这些小提示,你可以非常成功地完成这项工作
答案 3 :(得分:0)
using namespace std
,因为您已经使用std::
前缀对std成员进行了寻址。在我看来,这几乎总是最好的解决方案,因为using namespace X
指令可以被包含.h文件的其他文件继承。using namespace std
,请将该指令放在您的类中,以便包含您的其他文件不会拥有它。他们可能会定义与std相同名称的函数/类,如果上面有using namespace std
指令,则会导致编译错误。<iostream>
,因为它已经包含在标题中......是的,<iostream>
肯定有一个标题保护,所以它实际上不包括两次。但是我认为不包括已经包含在标题中的内容很好......但也许这只是我的口味...; - )