如何在不调用C++中的构造函数的情况下分配实例变量
How can I assign an instance variable without calling its constructor in C++?
基本上,我有一个叫做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
的一些构造函数。
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 如何在没有复制构造函数的情况下为地图设置值?
- 在没有默认构造函数的情况下创建的派生对象
- 在双重继承的情况下如何处理非标准构造函数
- 如何在不知道属性具有哪些构造函数的情况下初始化属性?
- 在 C++ 中,默认情况下构造函数为类的数据成员提供的值是多少?
- 如何防止类中的类对象尝试在没有默认构造函数的情况下自动构造自身?
- 为什么在这种情况下调用非常量右值移动构造函数?
- 在没有构造函数的情况下初始化 const c++ 类
- 在不使用默认构造函数的情况下声明 POD 结构时,会实例化什么?
- 父类有 26 个构造函数重载.如何在不复制+粘贴 26 个重载的情况下将一个小任务附加到所有构造器?
- 您可以在不调用构造函数的情况下调用攻击器吗?
- 在不调用构造函数的情况下创建 Vector 元素
- 默认情况下,我如何在不使用继承的情况下使用所有构造函数
- 在不调用其构造函数的情况下创建对象
- 在没有朋友的情况下向私有构造函数授予访问权限
- 构造函数/解构函数情况下的'undefined reference to vtable for'
- c#和c++中虚函数情况下编译器行为的差异.这是我在一次采访中被问到的问题