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

时间:2011-07-20 18:27:14

标签: 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  }

此代码导致错误:

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。

我该怎么做?

5 个答案:

答案 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的一些构造函数。