使用char *运算符随机输出

时间:2016-10-19 13:50:04

标签: c++ typecast-operator

我有一个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”),但返回值只是随机字母。

任何线索?

3 个答案:

答案 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;
    }
};