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