用户定义的结构/类计算

时间:2016-01-09 23:31:02

标签: c++ class math unity3d struct

我曾经使用Unity,他们使用一个很酷的系统来添加和增加向量。 这是参考文献(http://docs.unity3d.com/ScriptReference/Transform.html

的简短摘录
foreach (Transform child in transform) {
   child.position += Vector3.up * 10.0F;
}

正如您所看到的,即使它们可能具有不同的变量,它们也可以添加和相乘两个向量(结构/类)。现在,当我尝试进行这样的计算时,我必须单独添加2d浮点矢量的x和y。 那么如何添加像

这样的结构
struct Vec2f{
   float x;
   float y;
};

一起写

Vec2f c = a + b;

而不是

c.x = a.x + b.x;
c.y = a.y + b.y;

1 个答案:

答案 0 :(得分:3)

编辑:

你需要在结构中重载像'+',' - '等运算符。添加示例:

struct Vec2f
{
    float x;
    float y;

    Vec2f operator+(const Vec2f& other) const
    {
        Vec2f result;
        result.x = x + other.x;
        result.y = y + other.y;
        return result;
    }
};

编辑2: RIJIK发表评论:

  

我也想知道是否有一些技巧可以使功能不那么重复。我的意思是,如果我现在想要使用运算符,我必须为每个运算符创建一个函数,即使除了使用的运算符之外的函数之间没有很大的区别。你如何实现计算或许多运算符?

因此,您可以做的一件事是在运算符中使用另一个运算符。像你这样的东西可以通过简单地否定第二个数字来改变减法:

a - b变为+( - b)

当然,在结构中首先需要使用否定运算符来执行此操作。示例代码:

struct Vec2f
{
    float x;
    float y;

    Vec2f operator+(const Vec2f& other) const
    {
        Vec2f result;
        result.x = x + other.x;
        result.y = y + other.y;
        return result;
    }

    Vec2f operator-() const
    {
        Vec2f result;
        result.x = -x;
        result.y = -y;
        return result;
    }

    // we use two operators from above to define this
    Vec2f operator-(const Vec2f& other) const
    {
        return (*this + (-other));
    }
};

关于这一点的一个好处是,如果你改变加法例如你不需要改变减法。它会自动更改。

作为对此的回复:

  

但我不明白为什么我应该让这些功能保持不变。

因为那时你可以将这个函数用于常量变量。例如:

const Vec2f screenSize = { 800.0f, 600.0f };
const Vec2f boxSize = { 100.0f, 200.0f };
const Vec2f sub = screenSize - boxSize;

我在这里也使用花括号初始化,因为你没有定义任何构造函数。