Как заставить класс работать как строка для printf_s / sprintf_s? - PullRequest
0 голосов
/ 30 августа 2011

Я пытаюсь создать класс, скажем, 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 ]

9 голосов
/ 30 августа 2011

Если вы перегрузите его с помощью operator const char*, вы можете явным образом привести его:

MyClass name = "everyone";
printf_s("Hello %s!", (const char*)name);
// prints "Hello everyone!"

И тогда он будет вести себя правильно.Он не работает неявно, потому что printf может принимать любой тип параметра после первого, поэтому компилятор не знает, к чему его приводить.

Это предполагает, конечно, что operator const char* вашего класса возвращает строку в стиле C everyone.

Как отметил в комментариях Томалак Гереткал, если сделать ваш класс неявно преобразуемым в const char*, это может вызвать много проблем, поскольку он может сам себя привестибез вашего ведома.

Как и указал Kerrek SB, вероятно, не стоит делать ваш класс совместимым с printf, поскольку в конце концов это C ++.Было бы лучше написать перегрузку operator<< для ostream& s:

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 голос
/ 30 августа 2011

Вы не можете "обнаружить" намерение быть преобразованным в char const * при переходе в многоточие (...).Ваш объект просто будет помещен в стек, и вы, вероятно, потерпите крах.Это отличается от того, если ваш объект передается в функцию, которая явно принимает char const*, и в этом случае может быть запущен неявный оператор преобразования.полагаться как можно меньше на неявные преобразования.Вместо этого используйте член c_str() или что-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...