儘管您可以在定義「強制轉換爲浮動」方法時繼續進行回答,但我相信爲了您自己的利益,您開始利用公共API來實現其他行爲會更好。
一般來說,一個簡單的「鑄造」不會訣竅(例如,如果MyFloat
是MyMatrix
?會發生什麼?)。
下面的方法肯定比較冗長,但它強調你應該「吃自己的食物」,這意味着你應該嘗試基於你自己的公共接口來實現額外的行爲,而不是一堆晦澀的隱式演員,或friend
功能。如果您使用自己的API:您將瞭解其侷限性,並且如果您進行修改,可能會節省重新編譯主類。
另外,假設你想要計算對你的類的訪問(或者控制對基礎值的訪問):使用鑄造操作符,你需要複製operator float()
和float value()
中的代碼。
所以,這裏是我的卑微的建議,它似乎更長,但根據我的口味,更好地反映了面向對象的設計原則。
#include<iostream>
class MyFloat {
public:
MyFloat(float value):
m_value(value) { }
float value() const {
return m_value;
}
private:
float m_value;
};
// Eat your own food: implement functions using your public interface
// until proven need to do otherwise. This will help you assess the
// usability of your API.
float operator+(const MyFloat& lhs, const MyFloat& rhs) { return lhs.value() + rhs.value(); }
float operator+(const MyFloat& lhs, float rhs) { return lhs.value() + rhs; }
float operator+(float lhs, const MyFloat& rhs) { return lhs + rhs.value(); }
// See, now I can define another operator without need to recompile my
// class (this could have been placed in another file)
std::ostream& operator<<(std::ostream& os, const MyFloat& mf) {
os<<"MyFloat("<<mf.value()<<")";
return os;
}
int main() {
MyFloat x = 3.5; // would not work if I had declared the constructor as "explicit"
MyFloat y = x + 3.2;
MyFloat z = 3.4 + y;
std::cout<<x<<", "<<y<<", "<<z<<std::endl;
}
輸出(帶g++ example.cpp -Wall -Wextra
編譯):
MyFloat(3.5), MyFloat(6.7), MyFloat(10.1)
你需要做'+'非成員函數。 –
你可以讓一個非成員操作符重載 – IdeaHat
這已經有一段時間了,因爲我已經在C++中完成了操作符重載,但是他不能僅僅執行'MyFloat操作符+(float x){return num + x; }'?他將一個本地'float'添加到'MyFloat'實例。 – crush