2014-02-19 92 views
0

我收到以下錯誤信息:從基地創建一個派生類

conversion from ‘BaseClass’ to non-scalar type ‘DerivedClass’ requested 

在編譯時是這樣的:

AnotherClass response; 
DerivedClass message = response.serialize(QString("someStuff")); 

在那裏我有

BaseClass AnotherClass::serialize(const QString& valueName) const 

class DerivedClass : public BaseClass 
{ 
    ... 
    DerivedClass &operator=(const BaseClass &other); 
} 

有人可以解釋這裏有什麼問題,更重要的是爲什麼

回答

3
DerivedClass message = response.serialize(QString("someStuff")); 

這是副本初始化,不分配,而operator=甚至不進來玩。

您也需要一個構造函數BaseClass或寫這樣的:

AnotherClass response; 
DerivedClass message; 
message = response.serialize(QString("someStuff")); // assignment 
+0

對,我剛剛意識到=運算符。而且這是一個複製初始化而不是分配的問題。 +1 –

0

除了使用複製初始化,而不是賦值,因爲你以爲你是,你也違反了rule of three/four

的規則是,如果你有的以下任何,你必須有他們的所有(無論是實施或使用Q_DECL_EQ_DELETE刪除):

  1. 析構函數

  2. 拷貝構造函數移動構造函數(用於C++ 11)

  3. 賦值運算符

例如,假設您不想執行任務。你應該有:

class MyClass { 
    // private, deleted - compatible with both C++11 and C++98/03. 
    MyClass & operator=(const MyClass &) Q_DECL_EQ_DELETE; 
public: 
    MyClass(const MyClass &); 
    MyClass(MyClass &&); 
    virtual ~MyClass(); 
    ... 
};