簡體   English   中英

VS2010中的運算符重載和LNK2019錯誤

[英]Operator Overloading and LNK2019 error in VS2010

我正在編寫一個Point類,其中包含三個浮點數,xyz,一些函數和重載的運算符。 我以以下形式編碼運算符:

inline Point Point::operator+ (Point point)
{
    return Point(x + point.x, y + point.y, z + point.z);
}

inline void Point::operator+= (Point point)
{
   x += point.x;
   y += point.y;
   z += point.z;
}

這是使這些運算符過載的正確方法嗎? 我已經對其進行了測試,但是可以看到另一種形式:

inline Point& Point::operator+ (Point& point)
{
    return Point(x + point.x, y + point.y, z + point.z);
}

inline Point& Point::operator+= (Point& point)
{
    x += point.x;
    y += point.y;
    z += point.z;
        return *this;
}

兩種形式有什么區別?

我也可以在Point.cpp文件中使用運算符,但是如果嘗試在Main.cpp中使用它,則對於未解析的外部符號,我會收到lnk2019錯誤。 奇怪的是,我的函數在定義文件之外工作。 我缺少讓這些運算符在定義它們的文件之外工作的東西嗎?

第一個運算符應該是

inline Point Point::operator+ (const Point &point) const
{
    return Point(x + point.x, y + point.y, z + point.z);
}

它不應返回引用,因為它可以構造一個新對象並且不修改現有對象(一般的經驗法則)。 將const添加到函數中是因為不應修改其被調用的點。 添加了對該點的引用作為參數,因此不會有不必要的復制

第二個應該是

inline Point& Point::operator+= (const Point& point)
{
    x += point.x;
    y += point.y;
    z += point.z;
    return *this;
}

因為它應該修改現有的點,所以它應該返回一個引用。 將const添加到參數中,因為它不應更改。 函數本身不是const,因為它應該修改點本身。

您收到的鏈接器錯誤是由於內聯。 在頭文件中提供完整的實現,或刪除內聯。

inline Point& Point::operator+ (Point& point)
{
    return Point(x + point.x, y + point.y, z + point.z);
}

這是錯誤的,它返回對臨時函數的引用,該臨時函數在返回時不再存在。 如果您足夠幸運,將導致段錯誤。 如果嘗試這樣做,大多數編譯器都會給您警告。 理想情況下,您可以將此操作符編寫為自由函數,並根據您的成員operator+=

inline Point& Point::operator+= (Point& point)
{
    x += point.x;
    y += point.y;
    z += point.z;
        return *this;
}

這是相當多的首選方式,但你應該考慮的point作為一個const引用,否則你無法使用的臨時使用。 返回對自身的引用允許鏈接運算符。 一般說來,如果有疑問,請照常做,然后才做。

總結起來,“規范的”實現是:

inline Point& Point::operator+=( Point const& point )
{
    x += point.x;
    y += point.y;
    z += point.z;
    return *this;
}

inline Point const operator+( Point left, Point const& right )
{
     return left += right;
}

請注意,讓operator+為自由函數允許在兩個操作數(不僅是正確的操作數)上進行到Point轉換。 它可以根據operator+=方便地實現:左參數由值采用,以具有我們可以修改的臨時副本,我們可以通過向其添加右參數來實現。 由於operator+=返回一個引用,因此我們使用這種返回來提供將被復制為函數結果的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM