基本上,我有一个名为VisaMux的类和一个名为MuxPath的类.MuxPath有一个VisaMux私有实例变量.我希望MuxPath的构造函数在不调用空的VisaMux()构造函数的情况下为给定的VisaMux对象分配实例变量.
5 MuxPath::MuxPath(const uint& Clk_sel, const uint& Lane_sel, const VisaMux& Mux){
6 clk_sel = Clk_sel;
7 lane_sel = Lane_sel;
8 mux = Mux;
9 }
Run Code Online (Sandbox Code Playgroud)
此代码导致错误:
MuxPath.cpp:5: error: no matching function for call to ‘VisaMux::VisaMux()’
VisaMux.h:20: candidates are: VisaMux::VisaMux(const std::string&, const uint&, const uint&, const std::vector<VisaLane, std::allocator<VisaLane> >&, const std::vector<VisaResource, std::allocator<VisaResource> >&)
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,它在第一行(第5行)出错,所以似乎某些const VisaMux&Mux正在调用不存在的VisaMux().如果我只使用VisaMux Mux,也会发生这种情况.
我不希望它为VisaMux调用一个空的构造函数,因为我希望只通过传递构造函数所有必需的参数来创建VisaMux.
我怎样才能做到这一点?
使用构造函数初始化列表:
MuxPath::MuxPath(const uint& Clk_sel, const uint& Lane_sel, const VisaMux& Mux)
: clk_sel(Clk_sel)
, lane_sel(Lane_sel)
, mux(Mux)
{}
Run Code Online (Sandbox Code Playgroud)
在构造函数中使用member-initialization-list:
MuxPath::MuxPath(const uint& Clk_sel, const uint& Lane_sel, const VisaMux& Mux)
:clk_sel (Clk_sel),lane_sel(Lane_sel),mux(Mux)
{ //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ it's called initialization-list
}
Run Code Online (Sandbox Code Playgroud)
实际上,在你的代码中,所有成员变量都使用赋值而不是它们各自的构造函数,这意味着mux尝试使用默认构造函数构造,甚至在它进入构造函数之前MuxPath.并且因为VisaMux没有默认构造函数,所以它给出了编译错误.
因此,通过使用初始化列表(语法mux(Mux)调用其中的复制构造函数)VisaMux,可以避免调用默认构造函数VisaMux而不存在.由于mux它已经是复制构造的,因此不需要在构造函数体中使用赋值.