我有点困惑。我正在创建一个自定义" 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;
}
也许我累了或者其他什么,但对我来说并不是很明显我在这里缺少什么。
答案 0 :(得分:0)
假设这个代码完全编译(不清楚,因为没有给出完整的代码)那么语句
Variant v1 = "Hello";
Variant v2 = v1;
调用构造函数,而不是赋值运算符。
在第一个中,由于Variant
不提供接受字符串的构造函数,这意味着Value
会这样做,并且在调用构造函数之前正在进行到Value
的隐式转换。 Variant
。因此问题出在Value
的构造函数中,或者在parse()函数的工作中。尽管如此,这些都没有显示出来。
第二个语句调用编译器生成的复制构造函数。如果前面的结构没有按要求工作,那么也会引入问题。