构造函数生成 我有两个C++结构, Rect,这是一个浮点矩形和IcRe>/Cuth>,这是相同的,但具有整数: struct iRect { int X; int Y; int W; int H; }; struct Rect { float X; float Y; float W; float H; };

构造函数生成 我有两个C++结构, Rect,这是一个浮点矩形和IcRe>/Cuth>,这是相同的,但具有整数: struct iRect { int X; int Y; int W; int H; }; struct Rect { float X; float Y; float W; float H; };,c++,constructor,C++,Constructor,目前,我可以使用语法Rect{1.2,2.4,4.2,0.2}来构造它们 现在我想使这些函数隐式可转换,因此我为Rect创建了一个新的构造函数: Rect(iRect iR) { X = (float)iR.X; Y = (float)iR.Y; W = (float)iR.W; H = (float)iR.H; } 我得到:错误C2512:'Rect':没有合适的默认构造函数可用 没什么大不了的,我只定义一个空的默认构造函数 但现在我得到了错误C2440:“初

目前,我可以使用语法
Rect{1.2,2.4,4.2,0.2}来构造它们

现在我想使这些函数隐式可转换,因此我为Rect创建了一个新的构造函数:

Rect(iRect iR) {
    X = (float)iR.X;
    Y = (float)iR.Y;
    W = (float)iR.W;
    H = (float)iR.H;
}
我得到:
错误C2512:'Rect':没有合适的默认构造函数可用
没什么大不了的,我只定义一个空的默认构造函数

但现在我得到了错误C2440:“初始化”:无法从“初始值设定项列表”转换为“Rect”

因此,我必须为四个浮点、三个浮点、两个浮点和一个浮点定义另一个构造函数,使其具有与以前相同的行为。这个例子也被简化了:Rect实际上是两个
Vec2
类型的并集,因此我还必须为
Rect(vec2a,vec2b)
定义一个构造函数


通常,所有这些构造函数都是由编译器生成的。我有没有办法定义我的
Rect(direct-iR)
构造函数而不阻止编译器生成所有其他构造函数?

定义转换运算符,而不是定义构造函数:

每当必须隐式或显式地将Direct转换为Rect时,转换运算符就会生效(可以添加
explicit
关键字以将其限制为仅进行显式转换)。定义了此运算符后,现在可以编写

iRect a;
Rect b = a;
如你所料


由于转换运算符不是构造函数,因此它们不会抑制默认构造函数-所有聚合初始化都将继续工作

定义转换运算符,而不是定义构造函数:

每当必须隐式或显式地将Direct转换为Rect时,转换运算符就会生效(可以添加
explicit
关键字以将其限制为仅进行显式转换)。定义了此运算符后,现在可以编写

iRect a;
Rect b = a;
如你所料


由于转换运算符不是构造函数,因此它们不会抑制默认构造函数-所有聚合初始化都将继续工作

定义转换运算符,而不是定义构造函数:

每当必须隐式或显式地将Direct转换为Rect时,转换运算符就会生效(可以添加
explicit
关键字以将其限制为仅进行显式转换)。定义了此运算符后,现在可以编写

iRect a;
Rect b = a;
如你所料


由于转换运算符不是构造函数,因此它们不会抑制默认构造函数-所有聚合初始化都将继续工作

定义转换运算符,而不是定义构造函数:

每当必须隐式或显式地将Direct转换为Rect时,转换运算符就会生效(可以添加
explicit
关键字以将其限制为仅进行显式转换)。定义了此运算符后,现在可以编写

iRect a;
Rect b = a;
如你所料


由于转换运算符不是构造函数,因此它们不会抑制默认构造函数-所有聚合初始化都将继续工作

使用转换函数。这种类型的设计在许多库中实现(我想到的是Qt)。此外,转换构造函数没有理由使用iReCt副本,并且如果可能的话,您应该使用C++样式转换。你可以简单地写:

Rect toRect(const iRect& i)
{
    Rect r;
    r.X = static_cast<float>(i.X);
    r.Y = static_cast<float>(i.Y);
    r.W = static_cast<float>(i.W);
    r.H = static_cast<float>(i.H);
    return r;
}
Rect-toRect(const-direct&i)
{
矩形r;
r、 X=静态铸件(i.X);
r、 Y=静态铸件(i.Y);
r、 W=静态铸件(i.W);
r、 H=静态铸件(i.H);
返回r;
}

编辑:该死,@dyp打败了我。

使用转换功能。这种类型的设计在许多库中实现(我想到的是Qt)。此外,转换构造函数没有理由使用iReCt副本,并且如果可能的话,您应该使用C++样式转换。你可以简单地写:

Rect toRect(const iRect& i)
{
    Rect r;
    r.X = static_cast<float>(i.X);
    r.Y = static_cast<float>(i.Y);
    r.W = static_cast<float>(i.W);
    r.H = static_cast<float>(i.H);
    return r;
}
Rect-toRect(const-direct&i)
{
矩形r;
r、 X=静态铸件(i.X);
r、 Y=静态铸件(i.Y);
r、 W=静态铸件(i.W);
r、 H=静态铸件(i.H);
返回r;
}

编辑:该死,@dyp打败了我。

使用转换功能。这种类型的设计在许多库中实现(我想到的是Qt)。此外,转换构造函数没有理由使用iReCt副本,并且如果可能的话,您应该使用C++样式转换。你可以简单地写:

Rect toRect(const iRect& i)
{
    Rect r;
    r.X = static_cast<float>(i.X);
    r.Y = static_cast<float>(i.Y);
    r.W = static_cast<float>(i.W);
    r.H = static_cast<float>(i.H);
    return r;
}
Rect-toRect(const-direct&i)
{
矩形r;
r、 X=静态铸件(i.X);
r、 Y=静态铸件(i.Y);
r、 W=静态铸件(i.W);
r、 H=静态铸件(i.H);
返回r;
}

编辑:该死,@dyp打败了我。

使用转换功能。这种类型的设计在许多库中实现(我想到的是Qt)。此外,转换构造函数没有理由使用iReCt副本,并且如果可能的话,您应该使用C++样式转换。你可以简单地写:

Rect toRect(const iRect& i)
{
    Rect r;
    r.X = static_cast<float>(i.X);
    r.Y = static_cast<float>(i.Y);
    r.W = static_cast<float>(i.W);
    r.H = static_cast<float>(i.H);
    return r;
}
Rect-toRect(const-direct&i)
{
矩形r;
r、 X=静态铸件(i.X);
r、 Y=静态铸件(i.Y);
r、 W=静态铸件(i.W);
r、 H=静态铸件(i.H);
返回r;
}

编辑:该死,@dyp打败了我。

问题是,没有构造函数,就存在默认的聚合初始值设定项,请参阅。在定义自定义构造函数(我可能会说)时,聚合初始化不再可能

正如其他人指出的,最好定义一个转换运算符

struct iRect {
    //...
    /* explicit */ operator Rect() const {
        return Rect{X,Y,W,H};
    }
};
可以添加
explicit
,以便必须显式完成铸造,例如:

iRect r {1, 2, 3, 4};
Rect r2 = (Rect) r; // Explicit cast

问题是,如果没有构造函数,则存在默认聚合初始值设定项,请参阅。在定义自定义构造函数(我可能会说)时,聚合初始化不再可能

正如其他人指出的,最好定义一个转换运算符

struct iRect {
    //...
    /* explicit */ operator Rect() const {
        return Rect{X,Y,W,H};
    }
};
可以添加
explicit
,以便必须显式完成铸造,例如:

iRect r {1, 2, 3, 4};
Rect r2 = (Rect) r; // Explicit cast

问题是,如果没有构造函数,则存在默认的聚合初始值设定项s