【发布时间】:2020-09-15 07:39:37
【问题描述】:
我正在学习有关隐式转换运算符的更多信息,并且我注意到字符串的隐式用户定义转换有些奇怪。下面是代码。
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
class A {
public:
A() {
*value = "YIKERS";
}
operator string&() {
return *this->value;
}
string* value;
};
int main() {
A abc;
cout << abc << endl;
// compile error: invalid operands to binary expression ('std::__1::ostream' (aka
// 'basic_ostream<char>') and 'A')
return 0;
}
关于我为什么会收到此编译错误的任何想法?我在想这可能意味着该对象没有被隐式转换为字符串?如果是这样,为什么不呢?有没有办法解决这个问题?转换运算符非常适用于其他数据类型,如 int、float、char 等。
【问题讨论】:
-
ot:您应该存储
std::string而不是指向字符串的指针。它与您的问题无关,但它会使您的代码不那么“令人惊讶” -
即使编译了代码,它仍然无法正常工作,因为
A构造函数正在取消引用未初始化的指针,导致未定义的行为。 -
@RemyLebeau 为什么它是一个无效的指针?
-
“我的代码要求成员变量是一个指针”我强烈怀疑它需要是一个原始指针。
-
@MAGEPAC "为什么它是一个无效的指针?" - 因为在取消引用它以将数据分配给内存之前,您没有为指针分配有效的内存地址地址。鉴于您正在尝试,您需要分配一个有效的
string对象并将其内存地址分配给指针。为此使用new。然后确保A跟在Rule of 3 后面,确保string对象得到妥善管理。
标签: c++ operator-overloading implicit-conversion conversion-operator