如何在不调用C++构造函数的情况下分配实例变量?

And*_*ens 2 c++ constructor

基本上,我有一个名为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.

我怎样才能做到这一点?

Nic*_*las 6

使用构造函数初始化列表:

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)


Naw*_*waz 5

在构造函数中使用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它已经是复制构造的,因此不需要在构造函数体中使用赋值.