2015-12-14 16 views
1

如何定义一个运算符,其中一个操作数是定义的类型,另一个是int? 我有一个类DamageDamage.h这样定义:C++运算符重载与基元类型

#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 - =损坏

我也尝试过使用-运算符,诱惑,在课堂外定义它,传递两个不同的参数,但没有任何工作。

+0

你写的怪物:: TakeDamage的方式,“健康”应该是一个类以及(不是int),接受伤害类覆盖的运算符...(并访问运算符中的int值)。 – TomSmartBishop

+0

我认为这一点,但正如我重新考虑这一点,这样做将允许像最大值和最小值,如0,100(0将是静态的),并限制健康可以增加或不限制...感谢寻求帮助! – AustinWBryan

回答

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(); 
} 
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