我想知道覆盖 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,
不,这不是一个好主意。这不是一个好主意,因为它引入了您必须处理的内存管理问题。
- 内存对象是否具体?
如果答案是肯定的
- 如何为
char const*
分配内存? - 如何释放内存?
如果答案是否定的,
- 如何确保一个对象的字符串表示不会错误地用于第二个对象?
更好的选择是提供函数 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/