2017-03-25 87 views
0

我在C++中使用了複合模式和繼承。 它不應該是特別的東西,所以我編碼組件有父母作爲複合材料,複合材料應該從組件詮釋和使用它的基類(組件)的構造函數。但後來我得到了以下錯誤:C++的基礎構造函數左值參數

"Cannot convert lvalue of type 'Composite*' to parameter type 'Composite*'"

研究之了一下,發現了什麼左值/右值等都是,但沒有找到有關「參數」式的東西。參數類型是右值嗎? 是否可以將左值轉換爲參數類型?

這裏是我的代碼作爲一個較小的版本:

class Component { 
private: 
    Composite* parent; 
public: 
    Component(Composite* parent) { 
    this->parent = parent; 
    } 
}; 
class Composite : public Component { 
public: 
    Composite(Composite* parent) : Component(parent) /* <-- Error */ { } 
}; 
+0

修復了前向聲明並添加了缺少的分號之後,所顯示的代碼按原樣編譯得很好。顯示的代碼沒有問題。顯然,這個幻想代碼不是提供真正代碼的[mcve],而是這個幻想代碼。失敗。 –

+0

修復了分號並嘗試了代碼......但仍然出現錯誤 – TreCore

+0

「修復前向聲明」的哪部分原本不瞭解? –

回答

0

評論中更正的代碼。

class Composite; // <- _declare_ the idea of a Composite class here 

class Component { 
private: 
    Composite* parent; 
public: 
    Component(Composite* parent) { 
     this->parent = parent; 
    } 
}; 

class Composite    // <- _define_ it here 
     : public Component { 
public: 
    Composite(Composite* parent) : Component(parent) /* <-- no error */ { } 
}; 
+0

thx!所以我總是在基類之前聲明耙類,如果我在基類中使用耙類...但實際上是什麼意思是「參數類型」? – TreCore

+0

複合材料在首次「使用」之前必須已經「聲明」。即當你提到一個類型時,編譯器必須已經被告知它存在 - 即使你還沒有描述它的外觀。 –

+0

好吧有道理thx ...我也查了一下什麼是「參數類型」,但我不明白它與「左值」有什麼關係......參數類型只是特定參數的變量類型或我錯了嗎?所以我明白一個參數可以是一個左值或右值(如果你使用「const」作爲例子) – TreCore

相關問題