C++ 覆盖运算符 const char*

标签 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* 强制转换的重载。

谢谢!

最佳答案

I'm wondering if it would be possible,

是的,这是可能的。

whether or not a good idea,

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

  1. 内存对象是否具体?

如果答案是肯定的

  1. 如何为 char const* 分配内存?
  2. 如何释放内存?

如果答案是否定的,

  1. 如何确保一个对象的字符串表示不会错误地用于第二个对象?

更好的选择是提供函数 toString()

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

std::string toString() const;

如果您需要将其作为非成员函数,请使用:

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

你可以将它用作:

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

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

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

关于C++ 覆盖运算符 const char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31815504/

相关文章:

java - 将 Child 转换为 Parent 可以吗?

c - 无法在 C 中打印 float64 值

types - 我如何在 Rust 中惯用地将 bool 转换为 Option 或 Result?

JavaScript If/Else 条件和比较 - 差异

Java是否有用字符串变量替换字符串内占位符的功能

c - 用 C 语言编写 printf 和 scanf 无法按预期工作

c++ - 关于 C++ 中的移位运算符

c++ - 模板特化子类

c++ - 时间戳和字节数组

c++ - 从 C++/CLI 调用 DLL 函数时的 PInvokeStackImbalance