Что я должен использовать вместо sscanf?

Мой ответ о том, как синглтоны плохие, всегда таков: «их трудно сделать правильно». Многие из основополагающих компонентов языков являются синглетонами (классы, функции, пространства имен и даже операторы), как и компоненты в других аспектах вычислений (localhost, маршрут по умолчанию, виртуальная файловая система и т. Д.), И это не случайно. Хотя они время от времени доставляют неприятности и разочарование, они также могут заставить многое работать намного лучше.

Два самых больших провала, которые я вижу: это отношение к глобальному & amp; не в состоянии определить замыкание Синглтона.

Все говорят о Синглтоне как о глобале, потому что в основном это так. Тем не менее, большая (к сожалению, не вся) вредность в глобальном масштабе проистекает не из того, что он глобальный, а из-за его использования. То же самое касается синглетонов. На самом деле тем более, что «единый экземпляр» действительно не обязательно означает «глобально доступный». Это более естественный побочный продукт, и, учитывая все плохое, что мы знаем, оно исходит от нас, мы не должны спешить использовать глобальную доступность. Как только программисты видят Singleton, они, кажется, всегда получают к нему доступ напрямую через метод его экземпляра. Вместо этого вы должны перейти к нему так же, как к любому другому объекту. Большая часть кода даже не должна знать, что имеет дело с синглтоном (слабая связь, верно?). Если только небольшой кусочек кода обращается к объекту, как к глобальному объекту, большой вред отменяется. Я рекомендую применять его, ограничивая доступ к функции экземпляра.

Контекст Singleton также очень важен. Определяющей характеристикой Singleton является то, что существует «только один», но на самом деле он «только один» в некотором контексте / пространстве имен. Обычно это один из них: один на поток, процесс, IP-адрес или кластер, но также может быть один на процессор, компьютер, пространство имен языка / загрузчик классов / что угодно, подсеть, Интернет и т. Д.

Другая, менее распространенная ошибка - игнорировать образ жизни Синглтона. Тот факт, что существует только один, не означает, что синглтон является всемогущим «всегда был и всегда будет», и это не всегда желательно (объекты без начала и конца нарушают все виды полезных допущений в коде и должны использоваться только в самых безвыходных обстоятельствах.

Если вы избежите этих ошибок, Singletons все еще могут быть PITA, хотя он готов увидеть, что многие худшие проблемы значительно смягчены. Представьте себе Java Singleton, который явно определяется как один раз для загрузчика классов (что означает, что ему нужна политика безопасности потоков), с определенными методами создания и уничтожения и жизненным циклом, который определяет, когда и как они вызываются, и чей «экземплярный» метод имеет защиту пакетов, поэтому к нему обычно обращаются через другие, не глобальные объекты. Все еще потенциальный источник проблем, но, конечно, намного меньше проблем.

К сожалению, вместо того, чтобы преподавать хорошие примеры того, как делать Singletons. Мы преподаем плохие примеры, позволяем программистам убегать, используя их на время е, а затем скажите им, что они плохой шаблон проектирования.

26
задан Ben Hymers 23 June 2009 в 15:14
поделиться

4 ответа

Попробуйте std :: stringstream :

#include <sstream>

...

std::stringstream s("123 456 789");
int a, b, c;
s >> a >> b >> c;
38
ответ дан 28 November 2019 в 07:16
поделиться

Если вы включите sstream , у вас будет доступ к классам stringstream, которые предоставляют потоки для строк, что вам и нужно. В Roguewave есть несколько хороших примеров того, как его использовать.

2
ответ дан 28 November 2019 в 07:16
поделиться

fgets или strtol

-1
ответ дан 28 November 2019 в 07:16
поделиться

Для большинства заданий стандартные потоки отлично справляются со своей задачей,

std::string data = "AraK 22 4.0";
std::stringstream convertor(data);
std::string name;
int age;
double gpa;

convertor >> name >> age >> gpa;

if(convertor.fail() == true)
{
    // if the data string is not well-formatted do what ever you want here
}

Если вам нужны более мощные инструменты для более сложного синтаксического анализа, вы можете рассмотреть Regex или даже Spirit from Boost.

6
ответ дан 28 November 2019 в 07:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: