2013-11-29 74 views
1

我想用一個複製構造函數做一個非常簡單的字符串類,我遇到的問題是,我試圖發送一個數據類型/對象作爲一個常量,但每當我嘗試將它分配給相同的非常量數據,編譯器抱怨。Const數據類型不能被分配到一個非const數據類型

我不明白爲什麼會編譯器抱怨,我只是試圖複製數據,我不修改它。

部首

class MyString{ 
private: 
    char* thestring; 
    MyString* ms; 
public: 
    MyString(); 
    MyString(const char* str); 
    MyString(const MyString& str); 
    ~MyString(); 
    MyString& operator=(const char* str); 
}; 

CPP

MyString::MyString(){ 
    thestring = '\0'; 
} 

MyString::MyString(const MyString& str){ 
    ms = str; 
} 

MyString& MyString::operator=(const char* str){ 
    MyString* temp = new MyString(); 
    temp->thestring = str; 
    return temp; 
} 

MyString::MyString(const char* str){ 
} 

MyString::~MyString(){ 
} 

這裏的誤差修改:

從 「常量MyString的」 到沒有合適的轉換函數 「的MyString *」 存在9

a valu型的e「的常量字符*」不能被分配給類型 「字符*」 14

類型「的myString &」的基準(未常量限定)的實體不能 用類型的值初始化「 MyString的*」 15

'的MyString ::運算符=':必須返回一個值16

回答

2

首先,你不需要ms成員在你的類中:它沒有任何用途,它只用於你的(不正確的)複製構造函數。刪除ms,並重寫代碼如下:

MyString::MyString(const MyString& str) { 
    thestring = strdup(str.thestring); 
} 

注意,現在你的代碼侵犯了rule of three:一旦你增加一個拷貝構造函數,你還需要一個匹配賦值運算符和析構函數:

MyString& MyString::operator=(const MyString& str) { 
    if (this != &str) { 
     free(thestring); 
     thestring = strdup(str.thestring); 
    } 
    return *this; 
} 

MyString::~MyString() { 
    free(thestring); 
} 

最後,我想重寫默認的構造函數是這樣的:

MyString::MyString() 
: thestring(0) { 
} 

從本質上講,這是沒有什麼不同,但應該在初始化李st更加規範。

+0

+1。小記:對於作業分配,我認爲我們應該檢查自我分配'if(this!=&str)' – lolando

+0

@lolando謝謝,現在已經修復。 – dasblinkenlight

+0

爲什麼運營商需要一個MyString參數,當我分配一個帶有引號的值時,它將接收一個常量字符。 –

1

9號線:msMyString*,但str只是一個const MyString&(即不是指針)。

第14行:您不能const char*值賦給一個char*,因爲這將有可能使你改變它:

void foo(const char* dont_change_this) { 
    char* s = dont_change_this; 
    s[0] = '!'; // you changed it! 
} 

第15行:再一次,一個簡單的指針不匹配。 op =的返回類型爲MyString&,但temp的類型爲MyString*

+0

好的,我現在看到它。但是,MyString *與MyString有什麼不同?因爲它們都包含一個地址? –

+1

@DanielSega'MyString *'和'MyString&'完全不同 - 後者是[_reference type_](http://en.wikipedia.org/wiki/Reference_(C++))。你很可能會對使用'&'作爲運算符的一元地址和表示引用類型感到困惑 - 這些是不同的,大多是不相關的'&'的用法。 – Alec

0

但是,你不只是試圖複製數據,你試圖去除它的常量。換句話說,你試圖用const指針指定一個非const指針。這會給你潛在的改變你想成爲「const」的價值的能力。

相關問題