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

How can I assign an instance variable without calling its constructor in C++?

本文关键字:构造函数 情况下 实例 变量 分配 调用 C++      更新时间:2023-10-16

基本上,我有一个叫做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行(出错,所以看起来不知何故,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)
{}

在构造函数中使用成员初始化列表作为:

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的构造函数之前,就试图使用default构造函数进行构造。由于VisaMux并没有默认的构造函数,所以它给出了编译错误。

因此,通过使用初始化列表(其中语法mux(Mux)调用VisaMux的复制构造函数(,可以避免调用不存在的VisaMux的默认构造函数。由于mux已经是复制构造的,因此不需要在构造函数主体中使用赋值

   MuxPath::MuxPath(const uint& Clk_sel, const uint& Lane_sel, const VisaMux& Mux)
       : mux(Mux)
   {
       clk_sel = Clk_sel;
       lane_sel = Lane_sel;
   }

它被称为"初始化列表"。

class MuxPath {
  MuxPath(const uint& Clk_sel, const uint& Lane_sel, const VisaMux& Mux)
    : clk_sel(Clk_sel), lane_sel(Lane_sel), mux(Mux) {};
  ...
};

你有点问,如果不先安装墙钉,你怎么能在家里建红墙。如果MuxPath类包含一个Mux变量,那么在其构造过程中的某个时刻,它将需要实例化一个类型为Mux的变量。这意味着将创建一个类型为Mux的实例,唯一的机制是使用构造函数调用。

这可以是默认的,也可以是无arg构造函数、复制构造函数或接受其他参数的构造函数。其他答案显示了如何在成员初始化列表中执行此操作。但无法回避这样一个事实,即在某个时刻,需要调用Mux的一些构造函数。

相关文章: