2016-08-11 4 views
-3

期待どおりに動作しないクラスの変換は、私はそれを直接呼び出す簡単な変換方法</p> <pre><code>operator string() { return /*...*/; } </code></pre> <p>を定義し

obj.operator string() 

私はこのようにそれを呼び出したときにそれが正常に動作しますが、...

(string)obj 

結果は空の文字列です。

何が起こっているのですか?

クラス

class String : public std::string { 
     std::string str_; 
    public: 
     String() {}; 
     String(const String & s) { 
     str_ = std::string(s.str_); 
     }; 
     String(String && s) { 
     str_ = std::string(s.str_); 
     }; 
     String(const string & s) { 
     str_ = std::string(s); 
     }; 
     String(const char * s) { 
     str_ = std::string(s); 
     }; 

     char & operator[](size_t i) { 
     return str_[i]; 
     }; 
     String & operator=(const String & str) { 
     if (this != &str) { 
      str_ = str.str_; 
     } 
     return *this; 
     }; 
     String & operator=(String && str) { 
     if (this != &str) { 
      str_ = str.str_; 
     } 
     return *this; 
     }; 

     bool operator==(const String & str) { 
     return str_ == str.str_; 
     }; 
     bool operator!=(const String & str) { 
     return str_ != str.str_; 
     }; 

     operator string() { 
     return str_; 
     }; 
    }; 
+1

[mcve]または[SSCCE(Short、Self Contained、Correct Example)](http://sscce.org)で質問してください** – NathanOliver

+4

なぜあなたは 'std: :string'と別のメンバーインスタンスを使用していますか?あなたはスライスして、変換演算子を呼び出さない。 – LogicStuff

+0

さて、C++をしばらく使用していないので、意味が分かりません – Seraph

答えて

4

(必要に応じてコードを投稿することができます)(私はgccのC++ 14を使用しています)問題は、あなたのクラスがstd::stringから導出されていることです。

: public std::string部分を削除すると、変換演算子が使用されます。

あなたのクラスはすでにstd::stringのメンバーを宣言しています(したがって、 "has-a"アプローチを使用しています)。 "is-a"アプローチは必要ありません。

ところで、標準ライブラリクラスから派生する方法は、ほとんど常に悪い考えです(それらはそのために設計されていません)。

+0

ありがとう、私のコードで何が混乱... – Seraph

関連する問題