【问题标题】:Custom assignment operator for two classes that aren't my own两个不是我自己的类的自定义赋值运算符
【发布时间】:2018-02-11 13:43:20
【问题描述】:

我正在使用两个库,一个是线性代数数学库,另一个是物理库。具体来说,我需要在 vec3 和 btVector3 类型之间进行转换。我以为我可以这样做:

    void operator=(btVector3& lhs, const vec3& rhs)
    {
        lhs.setX(rhs.x); lhs.setY(rhs.y); lhs.setZ(rhs.z);
    }
    void operator=(vec3& lhs, const btVector3 rhs)
    {
        lhs.x = rhs.x(); lhs.y = rhs.y(); lhs.z = rhs.z();
    }

但我发现全局运算符重载只允许用于某些复合运算符,例如 +=、-= 等。显然赋值运算符必须是作为非静态成员函数的单参数函数。首先我想知道这是为什么。我已经看到了其他答案,但我认为我没有看到原因。其次,我还有另外一个问题,vec3 和 btVector3 这两种类型不是我的类型,所以我真的不想修改这些类(如果我什至不确定),可以简单地在这些类的标题?

【问题讨论】:

  • 我找到了几个assign函数,你是说std​​::function::assign()函数吗?哦,你的意思是创建我自己的分配函数。

标签: c++ operator-overloading assignment-operator


【解决方案1】:

首先我想知道这是为什么。

这是因为three/five/zero 的规则。如果你想定义一个赋值运算符,你还需要一个复制构造函数和一个析构函数。由于明显的原因,不允许在类之外定义构造函数或析构函数,因此赋值运算符也有同样的限制。

我还有另外一个问题,vec3btVector3 这两种类型不是我的类型,所以我真的不想修改这些类

你不需要这样做。在某种程度上,运算符是“语法糖”,可以让您编写更少的代码,但在大多数情况下,您可以不用它们。除非您需要在需要赋值运算符的第三方上下文中使用运算符,否则您可以将运算符重写为独立函数以获得相同的效果 - 像这样(std::swap 风格)

void assign(btVector3& lhs, const vec3& rhs)
{
    lhs.setX(rhs.x); lhs.setY(rhs.y); lhs.setZ(rhs.z);
}
void assign(vec3& lhs, const btVector3& rhs)
{
    lhs.x = rhs.x(); lhs.y = rhs.y(); lhs.z = rhs.z();
}

// Use like this:
assign(myVec3, myBtVec);
assign(myBtVec, myVec3);

或像这样(转换和分配样式)

btVector3 convert(const vec3& rhs)
{
    btVector3 res;
    res.setX(rhs.x); res.setY(rhs.y); res.setZ(rhs.z);
}
vec3 convert(const btVector3& rhs)
{
    vec3 res;
    res.x = rhs.x(); res.y = rhs.y(); res.z = rhs.z();
}

// Use like this:
myVec3 = convert(myBtVec);
myBtVec = convert(myVec3);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2015-09-22
    • 2017-08-19
    • 1970-01-01
    相关资源
    最近更新 更多