我有一個名為HealthPointshas hpand max_hpmembers 的類。我想多載 運算子,所以它會像這樣作業:
HealthPoints healthPoints1;
healthPoints1 -= 150; /* healthPoints1 now has 0 points out of 100 */
HealthPoints healthPoints2(150);
healthPoints2 -= 160; /* healthPoints2 now has 0 points out of 150 */
healthPoints2 = healthPoints1 160; /* healthPoints2 now has 100 points out of 100 */
我成功地使它作業,但只是以特定的順序。如果我把數字放在物件之前,有沒有辦法讓它識別它們兩者之間的數字并采取相應的行動?目前它的作業方式,我知道healthPoints2現在有 160 分(滿分 160 分)。
HealthPoints班級:
class HealthPoints {
public:
static const int DEFAULT_MAXHP=100;
static const int DEFAULT_HP=100;
static const int MINIMUM_MAXHP=1;
static const int MINIMUM_HP=0;
explicit operator int() const;
HealthPoints(int maxHP=HealthPoints::DEFAULT_MAXHP);
~HealthPoints() = default; // Destructor set to default
HealthPoints(const HealthPoints&) = default; // Copy Constructor set to default
HealthPoints& operator=(const HealthPoints&) = default; // Assignment operator set to default
HealthPoints& operator =(const HealthPoints& HP);
HealthPoints& operator-=(const HealthPoints& HP);
class InvalidArgument {};
private:
int m_maxHP;
int m_HP;
friend bool operator==(const HealthPoints& HP1, const HealthPoints& HP2);
friend bool operator<(const HealthPoints& HP1, const HealthPoints& HP2);
friend std::ostream& operator<<(std::ostream& os, const HealthPoints& HP);
};
HealthPoints::HealthPoints(int maxHP) {
if(maxHP < HealthPoints::MINIMUM_MAXHP) {
throw HealthPoints::InvalidArgument();
}
this->m_maxHP=maxHP;
this->m_HP=m_maxHP;
}
HealthPoints operator (const HealthPoints& HP1, const HealthPoints& HP2) {
return HealthPoints(HP2) =HP1;
}
HealthPoints operator-(const HealthPoints& HP1, const HealthPoints& HP2) {
return HealthPoints(HP1)-=HP2;
}
HealthPoints& HealthPoints::operator =(const HealthPoints& HP) {
if(this->m_HP HP.m_HP>this->m_maxHP) {
this->m_HP=this->m_maxHP;
} else {
this->m_HP =HP.m_HP;
}
return *this;
}
HealthPoints& HealthPoints::operator-=(const HealthPoints& HP) {
if(this->m_HP-HP.m_HP>HealthPoints::MINIMUM_HP) {
this->m_HP-=HP.m_HP;
} else {
this->m_HP=HealthPoints::MINIMUM_HP;
}
return *this;
}
uj5u.com熱心網友回復:
在本宣告中:
healthPoints2 = healthPoints1 160;
您的 操作員正在創建一個新HealthPoints物件,該物件是 的副本healthPoints1,因此該物件的m_maxHP設定為100。然后你添加160到那個物件,增加它m_HP但保留它的m_maxHP. 然后,您將該物件分配給healthPoints2,同時復制m_HP和m_maxHP值。這就是 的m_maxHP由healthPoints2變為的150原因100。
在本宣告中:
healthPoints2 = 160 healthPoints1;
您的 操作員正在創建一個設定為的新HealthPoints物件。然后你添加到那個物件,增加它但保留它的. 然后,您將該物件分配給,同時復制和值。這就是 的由變為的原因。m_maxHP160healthPoints1m_HPm_maxHPhealthPoints2m_HPm_maxHPm_maxHPhealthPoints2150160
如果您希望您operator的 s 僅更新m_HP而不更改m_maxHP,則需要添加接受int值而不是HealthPoints物件的多載,例如:
HealthPoints& HealthPoints::operator =(int value) {
m_HP = std::min(m_HP value, m_maxHP);
return *this;
}
HealthPoints& HealthPoints::operator-=(int value) {
m_HP = std::max(m_HP - value, HealthPoints::MINIMUM_HP);
return *this;
}
HealthPoints operator (const HealthPoints& HP, int value) {
return HealthPoints(HP) = value;
}
HealthPoints operator (int value, const HealthPoints& HP) {
return HealthPoints(HP) = value;
}
HealthPoints operator-(const HealthPoints& HP, int value) {
return HealthPoints(HP) -= value;
}
HealthPoints operator-(int value, const HealthPoints& HP) {
return HealthPoints(HP) -= value;
}
然后,將HealthPoints(int)建構式標記為在將值傳遞給期望物件的引數explicit時避免不必要的隱式轉換。intHealthPoints
uj5u.com熱心網友回復:
我不完全確定您HealthPoints課程的邏輯,因此請仔細檢查下面的代碼。不過,我的觀點是實施:
friend HealthPoints operator (const HealthPoints& other, int value);
friend HealthPoints operator (int value, const HealthPoints& other);
您實際上只需要實作第一個,并讓第二個使用它:
HealthPoints operator (const HealthPoints& hp, int value) {
HealthPoints ret{hp};
ret.m_HP = std::min(ret.m_maxHP, ret.m_HP value);
return ret;
}
HealthPoints operator (int value, const HealthPoints& hp) {
return hp value;
}
你可以在這里看到它的實際效果:
[演示]
int main() {
HealthPoints hp1{100};
hp1 -= 50;
std::cout << "hp1: " << hp1 << "\n";
auto hp2{hp1 10};
std::cout << "hp2: " << hp2 << "\n";
auto hp3{10 hp2};
std::cout << "hp3: " << hp3 << "\n";
}
// Outputs:
// hp1: (max_HP = 100, HP = 50)
// hp2: (max_HP = 100, HP = 60)
// hp3: (max_HP = 100, HP = 70)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/481812.html
