2017-07-08 32 views
0

我正嘗試使用std :: vector < char>創建自定義字符串類。operator =在我的自定義字符串類中無法正常工作

請看看下面我的代碼。

#include <iostream> 
#include <vector> 

class mString { 

public: 

    mString(); 
    explicit mString(const char *str); 
    mString(const mString &str); 

    mString operator=(const char *str); 

private: 

    typedef std::vector<char> vecChar; 
    vecChar _vc; 
}; 

inline mString::mString(){} 
inline mString::mString(const char *str) { 

    const vecChar::size_type size = strlen(str); 
    _vc = vecChar(str, str + size); 
} 
inline mString::mString(const mString &str) { 

    _vc = str._vc; 
} 

inline mString mString::operator=(const char *str) { 

    const vecChar::size_type size = strlen(str); 
    _vc = vecChar(str, str + size); 
    return *this; 
} 

int main(int argc, const char * argv[]) { 

    /* This works */ 
    mString a; 
    a = "Hello World"; 

    /* Error : No viable conversion from 'const char[12]' to mString */ 
    mString b = "Hello World"; 

    return 0; 
} 

我不明白爲什麼 'mString B = 「Hello World」 的;'不工作,而'mString a; a =「Hello World」;'作品。 爲了使其工作,我需要做些什麼?

預先感謝您!

+1

_「...不起作用......_」不是問題。你需要告訴我們它是如何工作的。 –

+0

不是[從初始化構造函數和賦值運算符創建的對象之間有什麼不同](https://stackoverflow.com/questions/35167580/what-different-between-object-created-from-initialization-constructor-and-分配)。問題是一樣的,但答案是不同的。行'mString b =「...」'不是賦值運算符。它是一個初始化構造函數。 –

回答

4

這與賦值運算符沒什麼共同之處。

你宣佈這個構造

explicit mString(const char *str); 

與函數說明explicit

在此聲明

mString b = "Hello World"; 

構造

因此不能被稱爲到字符串文字"Hello World"到類型mString的對象轉換。

刪除函數說明符explicit並聲明將編譯。或

而不是拷貝初始化爲在聲明之上,你可以因此在這個聲明

mString b = "Hello World"; 

有用於構造使用直接初始化像

mString b("Hello World"); 

。但在這個表達式中

a= "Hello World"; 

確實使用了賦值運算符。

+0

非常感謝你! –

+0

@ZackLee根本沒有。不用謝。 –

相關問題