类中未初始化的std :: string?

时间:2015-02-24 01:07:01

标签: c++ c++11 operator-overloading copy-constructor

我有点困惑。我正在创建一个自定义" Variant" class,但是我遇到了std :: string成员的一个奇怪问题。

当我尝试从另一个Variant实例分配它时,我得到一个异常,即该字符串是一个错误的指针。我不确定我理解为什么会发生这种情况,因为字符串应该是构造类时的实例。

这是我的代码:

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 v1 = "Hello";
Variant v2 = v1;   // <--- Here is where it occurs

现在,如果我创建一个manual = operator重载,我可以看到v2值是一个坏指针,但我不知道为什么。这是我的超载:

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

也许我累了或者其他什么,但对我来说并不是很明显我在这里缺少什么。

1 个答案:

答案 0 :(得分:0)

假设这个代码完全编译(不清楚,因为没有给出完整的代码)那么语句

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

调用构造函数,而不是赋值运算符。

在第一个中,由于Variant不提供接受字符串的构造函数,这意味着Value会这样做,并且在调用构造函数之前正在进行到Value的隐式转换。 Variant。因此问题出在Value的构造函数中,或者在parse()函数的工作中。尽管如此,这些都没有显示出来。

第二个语句调用编译器生成的复制构造函数。如果前面的结构没有按要求工作,那么也会引入问题。