2015-02-24 27 views
-1

我有點困惑。我正在創建一個自定義的「Variant」類,但遇到了std :: string成員的一個奇怪問題。在一個類中未初始化的std :: string?

當我嘗試從另一個Variant實例分配它時,我得到一個異常,該字符串是一個錯誤的指針。我不確定我是否明白爲什麼會發生這種情況,因爲字符串應該是構建類時的實例。

這裏是我的代碼:

Variant v1 = "Hello"; 
Variant v2 = v1; // <--- Here is where it occurs 

現在,如果我創建一個手動=操作符重載,我可以看到,V2值是:

class Variant : ObjectBase { 
public: 
    Variant() {}; 
    Variant(const Value& node) { parse(node); }; 

    ValueType Type = ValueType::Unknown; 

    Variant& operator= (bool value) 
    { Type = ValueType::Boolean; value_.vBool = value; return *this; }; 
    Variant& operator= (std::string value) 
    { Type = ValueType::String; value_string_ = value; return *this; }; 
    Variant& operator= (double value) 
    { Type = ValueType::Double; value_.vDouble = value; return *this; }; 
    Variant& operator= (int32_t value) 
    { Type = ValueType::Int32; value_.vInt32 = value; return *this; }; 
    Variant& operator= (int64_t value) 
    { Type = ValueType::Int64; value_.vInt64 = value; return *this; }; 
    Variant& operator= (uint32_t value) 
    { Type = ValueType::Uint32; value_.vUint32 = value; return *this; }; 
    Variant& operator= (uint64_t value) 
    { Type = ValueType::Uint64; value_.vUint64 = value; return *this; }; 
    Variant& operator= (const Value& node) { parse(node); }; 
private: 
    union Any { 
     int32_t vInt32; 
     int64_t vInt64; 
     double vDouble; 
     bool vBool; 
     uint32_t vUint32; 
     uint64_t vUint64; 
     Any() : vDouble(0) {}; 
    } value_; 

    std::string value_string_; 
}; 

我這樣做時,會出現異常壞指針,但我不知道爲什麼。這裏是我的過載:

Variant& operator= (const Variant value) { 
    value_ = value.value_; 
    value_string_ = value.value_string_; 
    Type = value.Type; 
    return *this; 
} 

也許我累了或什麼的,但它不是明顯對我什麼我在這裏失蹤。

+3

'warning:控制到達非空函數的結尾[-Wreturn-type] Variant&operator =(const Value&node){parse(node); };' – 2015-02-24 01:11:34

+4

'錯誤:沒有從'const char [6]'到'Variant'的可行轉換 Variant v1 =「Hello」;'http://coliru.stacked-crooked.com/a/7c16693de7a97ab9) – 2015-02-24 01:12:12

+0

如果你爲'char *'定義了一個賦值操作符? – 2015-02-24 01:35:36

回答

0

假設這個代碼在所有的編譯(,這是不明確的完整的源代碼並沒有得到),那麼語句

Variant v1 = "Hello"; 
Variant v2 = v1; 

調用構造函數,而不是賦值運算符。

在第一,由於Variant不提供接受字符串構造,這意味着Value確實,以及隱式轉換到Value被調用的構造Variant之前完成。因此,問題是在Value的構造函數中,或者在parse()函數的工作中。這些都沒有顯示。

第二條語句調用編譯器生成的拷貝構造函數。如果前面的建築沒有按要求工作,也會引入問題。

+0

看來這是vs2013的問題。我沒有看到在gcc中發生這個問題。這似乎工作http://coliru.stacked-crooked.com/a/4a6916cfc47e48ef 但在VS中,我其實不得不這樣做:'if(value.Type == ValueType :: String)\t \t \t value_string_ = value.value_string_;' – user3072517 2015-02-24 15:56:36

相關問題