gpt4 book ai didi

operator-overloading - D 运算符重载

转载 作者:行者123 更新时间:2023-12-04 08:21:04 25 4
gpt4 key购买 nike

import std.stdio;

struct Vector2
{
float x, y;

this (float x, float y)
{
this.x = x;
this.y = y;
}

// vector2 * number
Vector2 opBinary(string op)(const float rhs)
if (op == "*")
{
auto result = this;
this *= rhs;
return this;
}

// number * vector2
Vector2 opBinaryRight(string op)(const float lhs)
if (op == "*")
{
return this.opBinary!(op)(lhs);
}

/*
assignment operators
*/

// vector2 = vector2
ref Vector2 opAssign(const ref Vector2 rhs)
{
x = rhs.x;
y = rhs.y;
return this;
}

// vector2 *= number
ref Vector2 opOpAssign(string op)(const float rhs)
if (op == "*") {
x *= rhs;
y *= rhs;
return this;
}
}

unittest
{
auto first = Vector2(1, 2);
auto second = Vector2(3, 3);
auto number = 4.0f;

Vector2 result = first *= 3;
assert(result == Vector2(3, 6));
// BUG *
// assert(first == Vector2(1, 2));
}

void main()
{}

嗨。当我尝试使用 -unittest 选项编译这个小程序时,为什么最后一个断言失败了?任何帮助,将不胜感激。谢谢..

最佳答案

为什么您希望它通过?

first *= 3 修改first,因此它不保留其原始值。

也许你打算写

Vector2 result = first * 3;

?

Vector2 opBinary(string op)(const float rhs) 也有问题

这个函数就是用在像10 * v这样的表达式中。您的代码修改表达式 this *= rhs 中的 this。该功能应该实现:

auto result = this;
result *= rhs;
return result;

关于operator-overloading - D 运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6237364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com