2017-07-08 6 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";' while '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

explicit mString(const char *str); 

を宣言しました。

したがってこの宣言

mString b = "Hello World"; 

にコンストラクタはタイプmStringのオブジェクトへ"Hello World"リテラル文字列を変換するために呼び出すことができません。

関数指定子explicitを削除すると、宣言がコンパイルされます。

またはその代わりにあなたはそのため、この宣言

mString b = "Hello World"; 

が使用されているコンストラクタに

mString b("Hello World"); 

のように直接初期化を使用することができ、上記の宣言のようにコピーの初期化。しかし、この表現ステートメントでは、

a= "Hello World"; 

実際に代入演算子が使用されています。

+0

ありがとう! –

+0

@ZackLee全くありません。どういたしまして。 –

関連する問題