基本上,我有一个名为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 }
此代码导致错误:
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> >&)
正如你所看到的,它在第一行(第5行)出现错误,所以似乎某种程度上是常见的VisaMux&amp; Mux正在调用VisaMux(),它不存在。如果我只使用VisaMux Mux,也会发生这种情况。
我不希望它为VisaMux调用一个空的构造函数,因为我只想通过传递构造函数所有必要的参数来创建VisaMux。
我该怎么做?
答案 0 :(得分:6)
使用构造函数初始化列表:
MuxPath::MuxPath(const uint& Clk_sel, const uint& Lane_sel, const VisaMux& Mux)
: clk_sel(Clk_sel)
, lane_sel(Lane_sel)
, mux(Mux)
{}
答案 1 :(得分: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
}
实际上,在您的代码中,所有成员变量都使用赋值而不是各自的构造函数,这意味着mux
尝试使用构建默认构造函数,甚至在它进入MuxPath
的构造函数之前。由于VisaMux
没有默认构造函数,因此它给出了编译错误。
因此,通过使用初始化列表,其中语法mux(Mux)
调用VisaMux
的复制构造函数,您可以避免调用不存在的VisaMux
的默认构造函数。由于mux
已经是复制构造的,因此无需在构造函数体中使用赋值。
答案 2 :(得分:0)
MuxPath::MuxPath(const uint& Clk_sel, const uint& Lane_sel, const VisaMux& Mux)
: mux(Mux)
{
clk_sel = Clk_sel;
lane_sel = Lane_sel;
}
它被称为“初始化列表”。
答案 3 :(得分:0)
class MuxPath {
MuxPath(const uint& Clk_sel, const uint& Lane_sel, const VisaMux& Mux)
: clk_sel(Clk_sel), lane_sel(Lane_sel), mux(Mux) {};
...
};
答案 4 :(得分:0)
如果没有先安装墙钉,你就会问如何在你的房子里找到红墙。如果您的MuxPath
类包含Mux
变量,则在构造期间的某个时刻,需要实例化Mux
类型的变量。这意味着将创建类型为Mux
的实例,并且唯一的机制是使用构造函数调用。
这可以是默认构造函数,也可以是no-arg构造函数,复制构造函数或接受其他参数的构造函数。其他答案显示了如何在成员初始化列表中执行此操作。但是没有办法解决这样一个事实:在某些时候,需要调用Mux
的一些构造函数。