2013-05-10 131 views
0

爲什麼在以下代碼中獲得error: no match for ‘operator=’ in ‘y = x’
不能只將b的a分量分配爲像是a-object = a-object將基類對象分配給派生類對象

struct a {int i;}; 
struct b : public a {int j;}; 

int main() 
{ 
    a x; 
    b y; 

    x.i = 9; 
    y.j = 5; 

    y = x; // error: no match for ‘operator=’ in ‘y = x’ 

    // expected: y.i = 9 

    return 0; 
} 
+0

我懷疑你想使用指針或引用這裏 – 2013-05-10 07:55:14

+0

結構是值類型,不能分配給其他類型 – mojtaba 2013-05-10 07:55:49

回答

1

您沒有明確定義任何賦值運算符,因此編譯器將爲每個結構生成它自己的默認運算符。編譯器的默認賦值運算符bb作爲輸入,並將分配這兩個成員。使用繼承時,賦值運算符不會自動繼承。這就是爲什麼你無法將a傳遞給b - b中沒有任何賦值運算符,它將a作爲輸入。如果你想允許,你需要儘可能多的告訴編譯器,如:

struct a 
{ 
    int i; 

    a& operator=(const a &rhs) 
    { 
     i = rhs.i; 
     return *this; 
    } 
}; 

struct b : public a 
{ 
    int j; 

    using a::operator=; 

    b& operator=(const b &rhs) 
    { 
     *this = static_cast<const a&>(rhs); 
     j = rhs.j; 
     return *this; 
    } 
}; 

int main() 
{ 
    a x; 
    b y; 
    b z; 
    ... 
    y = x; // OK now 
    y = z; // OK as well 
    ...  
    return 0; 
} 
+1

如果我處理這樣的任務可以嗎? [鏈接](http://ideone.com/NZBtVG) – 2013-05-10 08:16:31

0

不,因爲即使這些類是相關的,它們也是不同的類型。

想想這個,即使它被允許並且它可以像你期望的那樣工作,那麼y.j的值在分配之後會是什麼?

+0

我希望它未經修改。我認爲只有從a派生出來的b的部分被分配給了。 – 2013-05-10 07:54:25

0

由於錯誤狀態,您需要實現賦值運算符。也就是說,一個函數告訴程序如何將一個對象分配給另一個對象。如果您在網上搜索,您可以找到大量的信息。 on http://www.cplusplus.com/articles/y8hv0pDG/

相關問題