如何使一个类作为printf_s / sprintf_s的字符串工作?

时间:2011-08-29 23:40:13

标签: c++ c printf

我正在尝试上课,让我们说 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 *(),但似乎都没有做到这一点。

2 个答案:

答案 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()成员或其他内容。