我目前正在进行作业,我需要创建一个DATABASE类,
其中包含员工指针数组和私有内部类,
定义员工链接列表
当 DB_TYPE = 0 时,我需要使用我的类方法来处理员工指针数组,
当 DB_TYPE = 1 时,我需要使用我的班级方法来处理员工关联列表。
因此,我需要两件事:
的 1。理解构造函数调用 -
当我构造一个新的DATABASE对象时,例如没有参数,
调用默认构造函数
如何从构造函数本身调用链接列表内部构造函数来构造节点?
2。根据DB_TYPE常量工作 -
我假设这不是一个麻烦,因为我可以设置我的方法使用
两个案例\或者'如果'关于DB_TYPE的每个值的条件
但如果那不那么简单,我很乐意就如何做到这一点给出一些建议或帮助。
编辑: 我的当前代码:
class DataBase {
public:
DataBase();
private:
Employee ** empArr; /*!< Employees pointers array */
unsigned int empCount;
Node head;
class Node{
public:
Node();
Node(Employee * emp, Node * next);
private:
Employee * emp; /*!< Employee Pointer */
Node * next; /*!< The next node (containing the next employee) */
};
};
谢谢,
Adiel
答案 0 :(得分:0)
Node node;
必须在class Node
的定义之后。
要在创建node
时调用Database
的非默认构造函数,请使用构造函数初始化列表:
Database::Database()
: head(foo, bar)
, empCount(0)
, empArr(nullptr)
{
}
您也可以并且应该初始化此列表中的其他成员。如果对象需要复杂的初始化,你可以写一个函数来做到这一点;通过构造函数体初始化应该是最后的手段。 (好吧,后来的手段,这不是一件可怕的事情)。
请注意,订单成员对象的初始化是它们在类定义中出现的顺序 - 而不是它们在构造函数初始化列表中出现的顺序。因此,例如,如果您的head
的构造函数参数必须来自empArr
,那么您必须确保Node head;
来自Employee **empArr;
,并且你必须编写一个函数来设置empArr
所以你的列表看起来像
: empCount(5), empArr( allocate_emparr(5) ), head(empArr[0], nullptr)
重新。 DB_TYPE
。由于它是预处理器,因此您可以在适当的情况下使用
#if DB_TYPE
// code for processing linked list
#else
// code for processing pointers array
#endif
这是非常强大的,虽然有些人认为它很难看。使用模板会更好,特别是如果类定义可以保持不变,并且只有少数函数的行为需要更改。但是,如果您之前没有使用过很多模板,那么编写模板版本很有挑战性。
示例声明(可以是类成员或自由函数):
template<int N> void do_something(void);
template<> void do_something<0>(void) { /* process pointers array */ }
template<> void do_something<1>(void) { /* process linked list */ }
用法:
void other_func(void)
{
do_something<DB_TYPE>();
}