【发布时间】:2021-08-23 09:37:24
【问题描述】:
将此 Vector3 转换为 const char* 在隐式和显式转换中都有效,但在构建时尝试对其进行转换时无效。只有这样 const char* 'v3pchar' 才会返回空白。有什么想法吗?完整代码如下。谢谢!
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
struct Vector3 {
int x, y, z = 0;
Vector3() {
cout << "Vector3()" << endl;
};
Vector3(int X, int Y, int Z) : x(X), y(Y), z(Z) {
cout << "Vector3(int X, int Y, int Z)" << endl;
};
// Focal point here
operator const char* () {
cout << "operator const char* called" << endl;
v3string = to_string(x) + ", " + to_string(y) + ", " + to_string(z);
v3pchar = v3string.c_str();
return v3pchar;
}
private:
string v3string = "Never even blank";
const char* v3pchar = "So why does this become blank?";
};
int main() {
Vector3 v1 = Vector3(1, 2, 3);
cout << "Vector3 implicit cast to char*: [" << v1 << "]" << endl; // Works
const char* v2 = v1;
printf("Vector3 explicit cast to char*: [%s]\n", (const char*)v2); // Works
cout << "---------------------------------------------" << endl;
const char* v3 = Vector3(4, 5, 6);
cout << "Vector3 instantiation cast to char*: [" << v3 << "]" << endl; // Empty
return 0;
};
【问题讨论】:
-
int x, y, z = 0;你确定不是int x = 0, y = 0, z = 0;? -
是的。您所做的只是将
z设置为0,而x和y未初始化,因此如果您调用不带参数的构造函数,x和y将保持未初始化状态。使用未初始化的变量是未定义的行为。int x = 0, y = 0, z = 0;将所有值设置为 0 以防止这种情况发生。 -
@josephtaylor
x和y的值默认不初始化。如果使用您的第一个构造函数(不带参数),则它们永远不会被赋值。因此,最终可能会得到一个处于“坏”状态的Vector3对象。使用该对象——也就是说,对它的x和y数据成员做任何事情——将是未定义的行为。如果您使用例如编译器编译,您的编译器可以通知您这些事情。-Wall标志。 -
哦,我什至没有意识到!我以为它会将它们全部设置为 0。也不知道
-
是的,值得记住的是,在大多数情况下,从函数或类方法返回裸指针是自找麻烦。您必须绝对确定正在处理的任何内容的生命周期。使用智能指针可以消除一些风险。见learncpp.com/cpp-tutorial/… 和stackoverflow.com/questions/752658/…
标签: c++ casting char-pointer