我有一個困難時期形成的什麼,我想問問,所以讓我給你舉個例子問題重載語法:基本操作在C++中
說我們是一個3D系統,我們有工作定義了一個矢量類Vec3。我們重載一些算術運算符以獲得明顯的響應。其中,我們重載*運算符,以便它返回兩個向量的點積。現在我們的代碼看起來應該是這樣的:
class Vec3{
private:
float x, y, z;
public:
float operator*(const Vec3&) const; //dot product
.
.
.
現在說,我們希望能夠通過使用運算符*的東西,以擴展我們的矢量,說一個浮動。這可以通過聲明來完成下列操作:
Vec3 operator*(const float) const;
friend Vec3 operator*(const float, const Vec3&);
這yeilds兩個重載和我不知道是否有一種方法只有一個做到這一點,也就是說,我們聲明,取代上述兩行這樣的:
friend Vec3 operator*(const Vec3&, const Vec3&);
然後添加Vec3 ctor的默認值來處理float的轉換。
最後一個例子將工作:
Vec3 someVec3 = 1.0 * otherVec3; //through friend Vec3 operator*(const float, const Vec3&)
但不是這個:
Vec3 someVec3 = otherVec3 * 1.0;
,因爲編譯器不知道要使用的兩個:
friend Vec3 operator*(const float, const Vec3&); //the one we want to use
or
float operator*(const Vec3&) const; //the one for the dot product
有什麼建議嗎?
謝謝!
兩個重載有什麼問題?正如你所指出的那樣,當你試圖簡化它時,會產生一個相當討厭的歧義...... – 2012-02-06 17:39:48
我會做不同的唯一的事情,就是使兩個版本的標量乘以友元函數,而不是一個成員,這樣代碼將會與操作本身具有相同的對稱性。 – 2012-02-06 17:52:42
構建一個僅僅傳遞一個浮點數的向量將是低效的。這將會導致運行時效率低下,但可以內聯一個額外的重載函數。 – QuentinUK 2012-02-06 17:58:01