C ++覆盖运算符const char *

时间:2015-08-04 17:21:09

标签: c++ casting printf

我想知道是否有可能覆盖operator const char*()以获得类似Java toString()的行为,因为%s分隔符代表const char* ,不是吗?我的意思是:

vec3 a(1, 2, 3); // operator const char*() returns a string "<x, y, z>"

printf("%s\n", (const char*)a);

预期产出:

<1, 2, 3>

现在,是的,我知道将operator<<(ostream&)简单地实现为

会更好一点
ostream& operator<<(ostream& rhs)
{
    rhs << "<" << x << ", " << y << ", " << z << ">";

    return rhs;
}

但幽默我,在这里。我已经编写了一段代码块,它不能很好地与iostream配合使用,但是使用旧的stdio函数可以更好地工作。我已经知道了iostream函数的好处,比如类型安全性,效率,更快的代码等。事实上,这似乎是代码嗅觉的问题,所以我最终可能会重写它。事实上,我已经尝试过几次重写它来实现流,但事实证明这是一个巨大的痛苦。所以,现在我只想知道如何为对象实现const char * cast的重载。

谢谢!

2 个答案:

答案 0 :(得分:4)

const char*强制转换操作符可能是内存管理的噩梦。谁会引用您的const char*指针来释放它?

如果您不想使用ostream运营商超载路线,是否有任何理由无法实施std::string toString() const方法或std::string toString(const vec3&)免费功能?每次要打印时,您都必须添加(const char*)部分,而不是.toString().c_str()

答案 1 :(得分:4)

  

我想知道是否可能,

是的,这是可能的。

  

是否一个好主意,

不,这不是一个好主意。这不是一个好主意,因为它引入了您必须处理的内存管理问题。

  1. 内存对象是否具体?
  2. 如果答案是肯定的,

    1. 如何为$raml2html -i src/sample.raml -o build/sample.html分配内存?
    2. 内存如何解除分配?
    3. 如果答案是否定的,

      1. 您如何确保错误地将某个对象的字符串表示形式用于第二个对象?
      2. 更好的选择是提供函数char const*

        如果您可以选择将其添加为成员函数,请使用:

        toString()

        如果您需要将其作为非会员功能使用,请使用:

        std::string toString() const;
        

        你可以用它作为:

        std::string toString(vec const& a);
        

        printf("%s\n", a.toString().c_str());
        

        取决于您是否具有成员函数或非成员函数。