【问题标题】:How can I assign an instance variable without calling its constructor in C++?如何在不调用 C++ 中的构造函数的情况下分配实例变量?
【发布时间】:2011-07-20 18:27:13
【问题描述】:

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

我该怎么做?

【问题讨论】:

  • 答案如下,告诉你使用初始化列表语法。我只想补充一点,您应该更喜欢使用初始化语法,否则您经常在参数列表中构造对象两次。默认情况下一次,然后在构造函数的主体内一次。此外,您应该按照声明它们的顺序将项目放入初始化列表中(参见 S. Meyers Effective C++ item 13)
  • @Andrew Wiens:看看这个答案here 解释了成员初始化和构造函数体内赋值之间的区别

标签: c++ constructor


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    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
    
    }
    

    实际上,在您的代码中,所有成员变量都使用 assignment 而不是它们各自的 constructor,这意味着 mux 尝试使用 default 构造函数,甚至在它进入MuxPath 的构造函数之前。而且由于VisaMux 没有默认构造函数,因此会出现编译错误。

    因此,通过使用初始化列表,其中语法mux(Mux) 调用VisaMux 的复制构造函数,您可以避免调用不存在的VisaMux 的默认构造函数。并且由于mux已经是复制构造的,所以没有必要在构造函数体中使用assignment

    【讨论】:

      【解决方案3】:
         MuxPath::MuxPath(const uint& Clk_sel, const uint& Lane_sel, const VisaMux& Mux)
             : mux(Mux)
         {
             clk_sel = Clk_sel;
             lane_sel = Lane_sel;
         }
      

      称为“初始化列表”。

      【讨论】:

        【解决方案4】:
        class MuxPath {
          MuxPath(const uint& Clk_sel, const uint& Lane_sel, const VisaMux& Mux)
            : clk_sel(Clk_sel), lane_sel(Lane_sel), mux(Mux) {};
          ...
        };
        

        【讨论】:

          【解决方案5】:

          您有点想知道如何在不先安装墙钉的情况下在您的房子里装上红墙。如果你的MuxPath 类包含一个Mux 变量,在它的构造过程中的某个时刻,它需要实例化一个Mux 类型的变量。这意味着将创建一个 Mux 类型的实例,并且唯一的机制是使用构造函数调用。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-23
            • 2011-06-02
            • 1970-01-01
            • 1970-01-01
            • 2014-08-03
            • 1970-01-01
            相关资源
            最近更新 更多