2014-03-19 170 views
0

我在找一個優雅的解決下面的「問題」:重載運營商+

考慮階級基礎和兒童,以及運營商+的方式在這裏工作:

class Base 
{ 
public: 
    Base(int a=0) : mValue(a) {}; 
    Base(const Base& rhs) : mValue(rhs.mValue) {}; 
    Base& operator=(const Base& rhs) { 
     if (this==&rhs) return *this; 
     mValue=rhs.mValue; 
    } 


    friend const Base operator+(Base &lhs, Base &rhs); 

private: 
    int mValue; 
}; 

const Base operator+(Base &lhs, Base &rhs) 
{ 
    Base result(lhs.mValue+rhs.mValue); 
    return result; 
} 

class Child : public Base 
{ 
public: 
    Child(int a=0) : Base(a) {}; 
}; 

int main() 
{ 
    Child a(2); 
    Child b(5); 
    Child c(a+b); // **** This line **** 
      Child d; 
      d=(a+b); // **** or this other one **** 

} 

標線主要給出錯誤: 不能從「常量基地」到「少年」

我完全理解的是,運營商已經在T定義轉換他基地類,並返回一個對象類型基地,它不能被轉換爲兒童。 一個解決方案是超載運營商+兒童類,但我想知道是否有更好的,成本更低的方法。我的印象是,我忘記了一個更簡單的選擇。謝謝!

+0

'd'在這裏是什麼? – rajenpandit

+0

對不起,錯字:)現在糾正 – DrD

+0

爲什麼'operator ='不返回任何東西?它甚至編譯?另請閱讀[copy-swap-idiom](http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom) – andre

回答

1

你可以定義一個構造函數Child(Base& obj)然後Child c=(a+b);聲明會很好,然後你可以根據你的需求使用基礎對象。

+2

而不是Child(Base&obj),它應該是Child(const Base&obj):Base(obj){}; –

+0

道歉rajenpandit,當我嘗試你的建議時,我實際犯了一個錯誤。它的作品,非常感謝你! – DrD

+0

@Bill Perkins - 謝謝,這正是我所嘗試的(rajenpandit忽略了* const *,但實際上我將它留在那裏,因爲它是我需要的) – DrD

0

如果您想從基礎構建一個孩子而不添加適當的構造函數,還有另一種方法。你可以聲明鑄造運營商在你的基類,返回你的mValue

operator int() const; 

這樣,編譯器將隱做的工作。

PS:確保添加劑經營者的常量,正確性:

friend Base operator+(const Base &lhs, const Base &rhs); 
1

有沒有更容易的選擇。

運算符重載和類層次結構並不真正喜歡混合。當一個應該是值類型的類型(或者你爲什麼重載運算符?)是層次結構的一部分時,我個人非常懷疑。你能描述一下你的實際架構嗎?在那裏超載操作員真的有意義嗎?

+0

實際的類比簡單的包裝int更復雜一點,但原理與示例中的相同。基類和派生類都需要*運算符+ *,具有相同的功能性,只有在派生類中它才返回派生對象。 – DrD

+0

這些類表示什麼使得它們需要運算符,但將它們置於繼承關係中? –

+0

它們是矩陣,派生類是基類的特殊類型。 – DrD