使用基元类型的C ++运算符重载

时间:2015-12-14 03:58:43

标签: c++ operator-overloading user-defined-types

如何定义一个操作数,其中一个操作数是定义的类型而另一个是int? 我有一个班级Damage,并在Damage.h

中定义
#pragma once

class Damage
{
public:
    Damage(int, int = 0, int = 0);

    int operator-= (int& num)
    {
        return num - this->GetDamage();
    }

private:
    int damage;
    int dotDamage;
    int dotDamageLength;
};

我正试图在Monster.cpp中使用这样的运算符:

#include "Monster.h"
#include "Damage.h"

int Monster::TakeDamage(Damage&  damage)
{
    this->health -= damage;        // Error Here
    return this->health;
}

错误是:     "没有操作员" - ="匹配这些操作数。     操作数类型是int - = damage。

我也试过使用-运算符,在我的多次尝试中,在类外定义它,传递两个不同的参数,但还没有任何工作。

2 个答案:

答案 0 :(得分:2)

您要做的是定义一个运算符,将Damage转换为int:

class Damage
{
public:
    // ...
    operator int () const
    {
        return this->GetDamage();
    }
};

Live Demo

现在Damage已隐式转换为int,您可以在需要进行此类转换的位置使用它。在你的情况下,减法:

Damage d; // assume that default damage dealt is 3
int health = 4;
health -= d; // health is now 1

答案 1 :(得分:2)

这将有效:

class Damage
{
public:
    Damage(int a, int b = 0, int c = 0)
        : damage(a), dotDamage(b), dotDamageLength(c)
    {

    }

    int GetDamage() const { return damage; }
private:
    int damage;
    int dotDamage;
    int dotDamageLength;
};
int& operator -=(int& n, const Damage& damage)
{
    n -= damage.GetDamage();
    return n;
}
int operator -(int n, const Damage& damage)
{
    return n - damage.GetDamage();
}