Перегрузка оператора D - PullRequest
3 голосов
/ 04 июня 2011
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 , почему последнее утверждение не выполняется?Любая помощь будет оценена.Спасибо ..

1 Ответ

5 голосов
/ 04 июня 2011

Почему вы ожидаете, что это пройдет?

first *= 3 изменяет first, поэтому оно не сохраняет свое первоначальное значение.

Возможно, вы хотели написать

Vector2 result = first * 3;

Существует также проблема с Vector2 opBinary(string op)(const float rhs)

Эта функция используется в выражениях типа 10 * v. Ваш код изменяет this в выражении this *= rhs. Эта функция должна быть реализована:

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