Здравствуйте, xobotik, Вы писали:
X> ~ResourceCreator() { X> _resource.release(); X> }
А зачем искусственно создавать утечку?
X> std::unique_ptr<T> &getResource() { X> return _resource; X> }
А зачем возвращать ссылку на unique_ptr? Чтобы кто-нибудь другой также имел возможность вызвать .release() и создать утечку? :)
Re: Практика использования std::unique_ptr std::call_once std::once_flag
X>Подскажите пожалуйста, плохо ли использовать (и почему плохо) std::unique_ptr , std::call_once и std::once_flag в следующем контексте:
Зачем все это? Выглядит ужасно. Я уже не говорю о возвращении неконстантной ссылки на член — можешь просто его сделать public. Будет то же самое, но проще.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Практика использования std::unique_ptr std::call_once std::once_flag
Здравствуйте, watchmaker, Вы писали:
W>Здравствуйте, xobotik, Вы писали:
X>> ~ResourceCreator() { X>> _resource.release(); X>> } W>А зачем искусственно создавать утечку?
Верно! Просмотрел этот момент!
X>> std::unique_ptr<T> &getResource() { X>> return _resource; X>> } W>А зачем возвращать ссылку на unique_ptr? Чтобы кто-нибудь другой также имел возможность вызвать .release() и создать утечку?
Верно не зачем. Кого-то другого нет, сам себе злобный буратино =)
Исправил на:
T &getResource() const {
return (*_resource.get());
}
С уважением!
Re[2]: Практика использования std::unique_ptr std::call_once std::once_flag
Здравствуйте, Vamp, Вы писали:
X>>Подскажите пожалуйста, плохо ли использовать (и почему плохо) std::unique_ptr , std::call_once и std::once_flag в следующем контексте: V>Зачем все это? Выглядит ужасно. Я уже не говорю о возвращении неконстантной ссылки на член — можешь просто его сделать public. Будет то же самое, но проще.
Нужно создать экземпляр класса один раз, вызвать функцию один раз.
Посмотрите Сценарий использования, подробно расписал все там.
С уважением!
Re: Практика использования std::unique_ptr std::call_once std::once_flag
Здравствуйте, xobotik, Вы писали:
X>Подскажите пожалуйста, плохо ли использовать (и почему плохо) std::unique_ptr , std::call_once и std::once_flag в следующем контексте:
не плохо
X>P.S. Если код не очень, скажите пожалуйста, где косяки =) _loger — опечатка в имени переменной
почему эта переменная в анонимном неймспейсе? вы хотите на каждую TU по своему логгеру? если же логгер один, то нужно иметь в виду порядок инициализации глобальных переменных, кто-то в другом классе может захотеть в конструкторе пологировать, а логгер еще не создан
пробрасывать аргументы надо так:
Здравствуйте, xobotik, Вы писали:
X>Нужно создать экземпляр класса один раз, вызвать функцию один раз.
Создать экземпляр класса:
auto obj = new Class(params);
вызвать функцию один раз:
obj->method(args);
X>Посмотрите Сценарий использования, подробно расписал все там.
пардон, но у вас там ООП головного мозга. Зачем делать через ж-у то, что можно сделать прямо и очевидным образом?
Re[4]: Практика использования std::unique_ptr std::call_once std::once_flag
Здравствуйте, antropolog, Вы писали:
A>Здравствуйте, xobotik, Вы писали:
X>>Нужно создать экземпляр класса один раз, вызвать функцию один раз.
A>Создать экземпляр класса: A>
A>auto obj = new Class(params);
A>
A>вызвать функцию один раз: A>
obj->>method(args);
A>
X>>Посмотрите Сценарий использования, подробно расписал все там. A>пардон, но у вас там ООП головного мозга. Зачем делать через ж-у то, что можно сделать прямо и очевидным образом?
КО? И каждый раз при записи в лог создавать экземпляр класса и вызывать функцию?
Вроде написал сценарий использования или напрасно ? ) Имя файла лога, должно содержать временную метку начала работы программы.
С уважением!
Re[2]: Практика использования std::unique_ptr std::call_once
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, xobotik, Вы писали:
X>>Подскажите пожалуйста, плохо ли использовать (и почему плохо) std::unique_ptr , std::call_once и std::once_flag в следующем контексте: U>не плохо
X>>P.S. Если код не очень, скажите пожалуйста, где косяки =) U> U> _loger — опечатка в имени переменной U> почему эта переменная в анонимном неймспейсе? вы хотите на каждую TU по своему логгеру? если же логгер один, то нужно иметь в виду порядок инициализации глобальных переменных, кто-то в другом классе может захотеть в конструкторе пологировать, а логгер еще не создан U> пробрасывать аргументы надо так: U>
Здравствуйте, xobotik, Вы писали:
X>Здравствуйте! X>Подскажите пожалуйста, плохо ли использовать (и почему плохо) std::unique_ptr , std::call_once и std::once_flag в следующем контексте:
Это синглтон, передача аргументов здесь не нужна, т.к. судя по использованию getLogFileName, createLogFile глобальные функции — их можно и в конструкторе вызвать.
call_once тут намекает на многопоточную инициализацию. Если компилятор поддерживает magic static, всё до безобразия просто:
Ну и в обеих случаях дрянь при использовании singleton в глобальных деструкторах (читай — в других singleton объектах). Тут уже либо феникс либо вообще без release.
Правильней будет создать и инициализировать логгер явно и передать его по ссылке в конструкторы всем кто будет его использовать, явно обеспечив ему большее время жизни (внешний скоп по отношению к использующим).
Re[2]: Практика использования std::unique_ptr std::call_once std::once_flag
Здравствуйте, andyp, Вы писали:
A>offtopic: A>А компиляторы, поддерживающие call_once, но не поддерживающие magic static в природе бывают?
Visual Studio например, call_once начиная 2012 а magic statics только в 2015.
A>Вроде и то и то — фишки С++ 11.
Ну тот же pthread_once задолго до magic statics появился, call_once просто его адаптация под стандарт.
Re[2]: Практика использования std::unique_ptr std::call_once std::once_flag
Здравствуйте, sokel, Вы писали:
S>Здравствуйте, xobotik, Вы писали:
X>>Здравствуйте! X>>Подскажите пожалуйста, плохо ли использовать (и почему плохо) std::unique_ptr , std::call_once и std::once_flag в следующем контексте:
S>Это синглтон, передача аргументов здесь не нужна, т.к. судя по использованию getLogFileName, createLogFile глобальные функции — их можно и в конструкторе вызвать. S>call_once тут намекает на многопоточную инициализацию. Если компилятор поддерживает magic static, всё до безобразия просто:
Ну собственно std::call_once и использовал, чтобы была гарантия одной инициализации, даже если кто-то вызовет в разных потоках дважды инициализацию. Разве magic static дает нам такую возможность?
С уважением!
Re[5]: Практика использования std::unique_ptr std::call_once std::once_flag
Здравствуйте, xobotik, Вы писали:
X>КО? И каждый раз при записи в лог создавать экземпляр класса и вызывать функцию? X>Вроде написал сценарий использования или напрасно ?
зачем все эти извращения с недосинглтонами, гонками и прочей ахинеей, когда можно сделать просто:
//loggger.h
//Интерфейс лога, подключается там, где нужно писать в лог
log(severety, message);
//logger_factory.h
//Интерфейс фабрики логгера, подключается только в одном файле - в main.cpp
initLog(filename)
deinitLog();
кому нужен лог — подключает logger.h и пишет в лог. Логгер инициализируется один раз явно в main. Код понятен даже ребёнку. Работает стабильно. Ошибиться очень тяжело. Повторяю вопрос — "Зачем делать через ж-у то, что можно сделать прямо и очевидным образом?"
Re[6]: Практика использования std::unique_ptr std::call_once
Здравствуйте, antropolog, Вы писали:
A>кому нужен лог — подключает logger.h и пишет в лог. Логгер инициализируется один раз явно в main. Код понятен даже ребёнку. Работает стабильно. Ошибиться очень тяжело. Повторяю вопрос — "Зачем делать через ж-у то, что можно сделать прямо и очевидным образом?"
Сделать можно, только использовать его могут на стороне через ж-у и не очевидным способом. Поэтому хотелось сделать гарантированную разовую инициализацию.