嵌套类和构造函数调用理解

时间:2014-05-24 11:54:35

标签: c++ constructor nested-class

我目前正在进行作业,我需要创建一个DATABASE类,
其中包含员工指针数组私有内部类
定义员工链接列表

根据任务,在这里完成的目标是工作 到 DB_TYPE 定义的常量。

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

1 个答案:

答案 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>();
}