我正在尝试上课,让我们说 MyClass ,在以下条件下工作:
MyClass name = "everyone"; // Assigns "everyone" into a local string variable.
printf_s("Hello %s!", name); // Should output "Hello everyone!" without the quotes.
我尝试重载运算符const char *()以及运算符char *(),但似乎都没有做到这一点。
答案 0 :(得分:9)
如果您使用operator const char*
重载它,则可以明确地转换它:
MyClass name = "everyone";
printf_s("Hello %s!", (const char*)name);
// prints "Hello everyone!"
然后它会表现得很好。它不会隐式工作因为printf
可以在第一个参数之后采用任何类型的参数,因此编译器不知道尝试将其转换为什么。
当然,这假定您的类的operator const char*
返回C风格的字符串everyone
。
正如Tomalak Geret'kal在评论中指出的那样,将你的类隐式地转换为const char*
可能会导致很多问题,因为它可以在你不知道/不想要它的情况下自我投射。
正如Kerrek SB也指出的那样,可能不值得让你的类与printf
兼容,因为这毕竟是C ++。为operator<<
s编写ostream&
重载更好的风格:
ostream& operator<<(ostream& rhs, const MyClass& c) {
rhs << c.name; // assuming the argument to the constructor
// is stored in the member variable name
return rhs;
}
MyClass name = "everyone";
cout << "Hello " << name << '!';
// prints "Hello everyone!"
答案 1 :(得分:1)
传递到省略号(...)时,无法“检测”转换为char const *的意图。您的对象将被放在堆栈中,您可能会崩溃。这与将对象传递给显式采用char const*
的函数不同,在这种情况下可以触发隐式转换运算符。
我建议使用与标准库相同的路径,尽可能少地依赖隐式转换。相反,请使用c_str()
成员或其他内容。