如何在C 中的单个构造函数中调用多个构造函数

How to call multiple constructors inside a single constructor in C++

本文关键字:构造函数 调用 单个      更新时间:2023-10-16

我在C 中有一个正在处理多个功能的运行程序,我正在尝试将程序转换为可以使用构造函数的实现。程序看起来如下

bool netlist::create(const evl_wires &wires,
    const evl_components &comps)
{
    return create_nets(wires)&& create_gates(comps);
}
netlist::netlist(const evl_wires &wires,
    const evl_components &comps)
{
    create(wires, comps);
}

在主要功能中,我成功地称呼构造函数

netlist nl(wires, comps);

更改我试图通过添加更多的构造函数来实现这样的实现

netlist::netlist(const evl_components &comps)
{
    create_gates(comps);
}
netlist::netlist(const evl_wires &wires)
{
    create_nets(wires);
}
netlist::netlist(const evl_wires &wires,
    const evl_components &comps)
{
    //this->netlist::netlist(wires);//this approach doesn't work
    //this->netlist::netlist(comps);
    *this = netlist::netlist(wires);//it doesn't work too
    *this = netlist::netlist(comps);
}

在互联网网站上给出的示例,包括一个,只是显示如何在另一个内部调用一个构造函数,我们如何在一个示例中调用多个构造函数?另一个问题是,当使用我的程序代码的情况下,使用构造函数实现比实施量更好时?

您要寻找的是委派构造函数(在C 11中引入(,您可以在另一个构造函数的成员初始化列表中调用构造函数,例如:

netlist::netlist(const evl_components &comps)
{
    create_gates(comps);
}
netlist::netlist(const evl_wires &wires)
{
    create_nets(wires);
}
netlist::netlist(const evl_wires &wires, const evl_components &comps)
    : netlist(wires) // <-- delegating here!
{
    create_gates(comps);
}

请注意,您只能一次委派一个构造函数,因此在上面的示例中,2-Param构造函数不可能将两个构建器委派给两个 1-param构造函数。但是,您可以在代表团上交换,因此1-Param构造函数都将其委托给2-Param构造函数:

netlist::netlist(const evl_components &comps)
    : netlist(evl_wires(), comps)
{
}
netlist::netlist(const evl_wires &wires)
    : netlist(wires, evl_components())
{
}
netlist::netlist(const evl_wires &wires, const evl_components &comps)
{
    create_nets(wires);
    create_gates(comps);
}

但是,在您的特定示例中,将任何构造函数委派的好处几乎没有。由于您已经具有初始化两个组件的通用功能,只需直接调用它们:

netlist::netlist(const evl_components &comps)
{
    create_gates(comps);
}
netlist::netlist(const evl_wires &wires)
{
    create_nets(wires);
}
netlist::netlist(const evl_wires &wires, const evl_components &comps)
{
    create_nets(wires);
    create_gates(comps);
}

如果您是pre-c 11,则需要移动通用代码以分开函数并将其与构造函数拨打。

如果您可以访问C 11,请使用委派构造函数。