[英]Why does an explicitly declared constructor prevent member initialisation with a C++ 11 initialisation list?
[英]Translating C++ member initialisation constructor to Julia
我在 C++ 中有这个 class 并想在 Julia 中复制它。
class Clock
{
double epsilon;
double dt;
int64_t timestep;
double t;
Clock(double _epsilon=1e-14) : epsilon(_epsilon)
};
到目前为止我有
mutable struct Clock
epsilon::Float64
dt::Float64
timestep::Int64
t::Float64
#Need the constructor#
end
我相信最接近 C++ 的行为如下:
mutable struct Clock
epsilon::Float64
dt::Float64
timestep::Int64
t::Int64
Clock(epsilon=1e-14) = new(epsilon)
end
这使得字段的 rest 不完整。 由于它们具有所谓的位类型,因此它们实际上已被初始化,但具有未定义的值(与 C++ 相反,它们未初始化,IIUC),因此在没有赋值的情况下访问字段不会出错(对于非位类型,比如数组)。
该结构必须是可变的,否则在构造值之后您无法更改字段并且永远留下一堆垃圾。
但是可以说,不完全初始化并不是特别惯用的,或者至少要尽可能避免。 我宁愿这样写类型:
struct Clock
epsilon::Float64
dt::Float64
timestep::Int64
t::Int64
end
Clock(epsilon=1e-14) = Clock(epsilon=epsilon, 0.0, 0, 0)
(或任何对您有意义的默认值),并坚持使用不可变函数来操作它。 第二个变体使用外部构造函数,它基本上只是类型上的一个方法(特殊的东西,如new
和不完整的初始化仅在内部构造函数中可用)。 这个外部构造函数调用默认提供的内部构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.