我正在完成C ++任务,我遇到了将所有类连接在一起的问题。这些类有基本的构造函数,getter,setter等等。所以我很有信心我得到的丰富的编译器错误是由于我错误地混合和匹配我的所有类...
我的类被分成cpp和h文件,每次该类需要来自另一个类的东西时,我基本上都使用了include语句。哪个类需要如下所示的基本图表:
基本上我想弄清楚的是,如果在CustomerOrder和零售商中使用#include“Product.h”搞砸了,或者我这样做是错误的。
任何帮助都很可爱! 谢谢!
编辑:
这是每个班级基本上做的事情的一个例子。 Customer类包含一组CustomerOrders,CustomerOrders包含一系列产品等等。
...
class Customer
{
private:
string customerName;
string customerID;
float balance;
static const int ORDERSIZE = 2;
CustomerOrder* orderList[ORDERSIZE];
Retailer retailer;
...
和客户订单:
...
class CustomerOrder
{
private:
static const int SHOPSIZE = 20;
Product* shoppingList[SHOPSIZE];
...
答案 0 :(得分:2)
首先,您的图表令人困惑。在OOP中,像你使用的那样的箭头表示公共继承,但在这里似乎并非如此(也不应该如此)。
您的问题一般无法解答。如果您需要完整类型,则#include
另一个类。否则,前向声明将会发生。这只会对编译速度产生影响。然而,规则是使用前向声明,如果可以,#include
s,如果你必须。
在某些情况下,您可以获得前瞻性声明:
1。)指针:
class AnotherClass; // <-- forward declaration
class Example
{
// ...
AnotherClass *another_class;
};
2。)参考文献:
class AnotherClass; // <-- forward declaration
class Example
{
// ...
void f(AnotherClass &another_class);
};
3。)返回值:
class AnotherClass; // <-- forward declaration
class Example
{
// ...
AnotherClass Get();
};
一旦实际使用了前向声明的类的对象,就需要#include
。如果您忘了,编译器会提醒您。
警告1:在标准容器中使用前向声明(即所谓的“不完整”)类型时要注意。您的编译器可能会允许这样做,但这样做是未定义的行为!
class Example; // forward declaration
std::vector<Example> v; // undefined behaviour!
警告2:不要尝试向前声明标准类。只需执行#include <vector>
,#include <string>
等等,让编译器弄清楚如何优化编译时间。
编辑:实际上,链接器而不是编译器会提醒你,如果你忘记包含一个你无法前向声明的前向声明的类,但这只是一个挑剔:)