我有一个c ++类,我希望能够打印一个对象,所以我创建了一个char * cast运算符。问题在于,由于某种原因,运算符函数的输出是随机符号而不是我返回的字符串。 这是代码:
operator const char*()const {
std::cout << (std::to_string(Nom) + '/' + std::to_string(Denom)).c_str() << std::endl;
return (std::to_string(Nom) + '/' + std::to_string(Denom)).c_str();
}
和主要功能:
Rational r1(7, 15);
std::cout << r1<<std::endl;
return 0;
第一行输出正常(“7/15”),但返回值只是随机字母。
任何线索?
答案 0 :(得分:4)
(std::to_string(Nom) + '/' + std::to_string(Denom))
创建一个临时变量。 .c_str()获取该变量拥有的某些内存的地址。
不久之后,该变量被销毁(您不会将其复制/移动到任何地方)。释放了内存。
您从c_str()获取的地址虽然保留了,但现在它指向的某些内存可能现在也可能不是您应用程序的一部分。试图阅读这个是Undefined Behavior(或者在这个站点简称UB)。
答案 1 :(得分:3)
替换返回管理内存的对象,而不是原始const char*
。
operator std::string () const {
std::stringstream ss;
ss << Nom << '/' << Denom;
return ss.str();
}
答案 2 :(得分:0)
对其他答案的补充:通常隐式演员操作员是一种糟糕的风格。特别是对于与你的班级无关的类型的演员。
如果你想投射你的物体,更好的方法可能是一个明确的演员:
class Rational
{
public:
...
std::string toString() const
{
return std::to_string(Nom) + '/' + std::to_string(Denom);
}
};
你可以用它重载“out”函数:
std::ostream & operator <<(std::ostream &stream, const Rational &obj)
{
stream << obj.toString();
return stream;
}
如果只需要输出对象,也可以使用不带强制转换功能的重载:
class Rational
{
public:
...
friend std::ostream & operator <<(std::ostream &stream, const Rational &obj)
{
stream << std::to_string(obj.Nom) + '/' + std::to_string(obj.Denom);
return stream;
}
};