2016-08-11 41 views
-3

我定義的簡單轉換方法級轉化工作不正常

operator string() { return /*...*/; } 

當我直接調用它

obj.operator string() 

它工作正常,但是當我把它這樣...

(string)obj 

結果爲空字符串。

發生了什麼事? (我用gcc C++ 14)(能張貼代碼如果需要的話)

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

的問題是,你的類是從std::string獲得。

刪除: public std::string部分,將使用轉換運算符。

您的課程已宣佈成員std::string(因此它使用「has-a」方法)並且不需要「is-a」方法。

從標準庫類派生的方式幾乎總是一個壞主意(他們不是爲此設計的)。

+0

謝謝你,我的代碼裏亂七八糟...... – Seraph