Anonymous
но делай отключаемым
Ну нельзя же. Видеокарт разных - тьма. И не все будут правильно жевать код, обязательно какой-то заразе что-то не понравится Чтобы фиксить - нужен баг репорт от игрока
Anonymous
10/10
Aidar
по скринам не понятно или что?
Anonymous
Ты сейчас серьезно?
Aidar
прога не упадет в любом случае
Aidar
там будет инфа о готовности фреймбуфферов например и все
Aidar
остальную всеравно собирать дополнительно
☕️
Можно подробнее?
отправлю в лс, а то оказывается я тут бесправный(((
Anonymous
окей
Anton
Всегда можно сделать цепочки ошибок/исключений как в java, c# и прочих. Например у WindowException есть поле innerException или cause, без разницы, в котором содержится информация о другом исключении которое привело к WindowException.
Ioann_
Ребят, а если есть базовый класс, в нем есть енамчики, а я их хочу расширить, но так, чтобы все виртуальные функции адекватно работали после расширения, то как мне собсно эти енамчики расширить ?
Ioann_
менять базовый класс я не могу, если что
Antontsue
Врапать
Ioann_
а многие виртуальные функции - в аргументах передают сий енам
Antontsue
Будто это тхирдпати
Ioann_
ну это Qt
Antontsue
И что?
Ioann_
Если врапать, то как ?
Antontsue
Врапни енам и врапни обьекты с которыми работаешь
Antontsue
У енама будут доп значения
Antontsue
У врапперов классов-нужные методы с конвертацией параметров в формат сигнатур методов врапнутых классов
Ioann_
Объясни, что ты имеешь ввиду под словом врапать, я что-то не очень догоняю
Antontsue
Обернуть
Ioann_
можешь накатать Easy тестовый код, в пару строк - я что-то не очень понимаю, что именно требуется
Anatoly
можешь накатать Easy тестовый код, в пару строк - я что-то не очень понимаю, что именно требуется
объясни, что ты хочешь расширить и как ты хочешь, чтобы базовый класс узнал о твоих изменениях?
Antontsue
Сделай класс в котором один приватный мвар - враппнутый класс. В паблике копии всех нужных методов
Ioann_
объясни, что ты хочешь расширить и как ты хочешь, чтобы базовый класс узнал о твоих изменениях?
Ну, собсно, тут все просто - у Qt, в qstyle.h есть enum ControlElement, менять сорсы кути я не могу, потому что лицензия у него такая. Хочу туда добавить свой тип в уже существующий enum
Ioann_
Проблема в том, что у него все виртуальные функции завязаны на этом енаме - его перечислениях, типа CE_PUSH_BUTTON и т.п
Ioann_
Сделай класс в котором один приватный мвар - враппнутый класс. В паблике копии всех нужных методов
На сколько я понимаю, мне придется каждый enum Qt, конвертировать в свой :)?
Antontsue
А тот класс все енумы из qt использует?
Anatoly
Anatoly
с которой ты можешь продолжить для своих кастомных енумов отсчет
Ioann_
Не очень понимаю, как этим пользоваться. Для чего константа - я понимаю, чтобы я мог продолжать что-то делать, но как это правильно в классе наследнике использовать ?
Antontsue
Вообще тебе надо врапать только те енумы которые тебе нужны. А остальные использовать как есть, просто прокидывать значение без доп действий
Antontsue
Ioann_
с которой ты можешь продолжить для своих кастомных енумов отсчет
То есть, тут они намекают, просто на то, что я должен создать свой любой ENUM и дальше делать что хочу, начав с нужного конста ?Я об этом думал, и потом подумал, а вдруг Qt заменят на enum class эту штуку :?
Anatoly
class MyStyle : public QStyle { enum { MY_CUSTOM_CONTROL = QStyle::CE_CustomBase, ...} void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = Q_NULLPTR) const override { if( element == MY_CUSTOM_CONTROL) { ... } else { QStyle::drawControl(...); } } }
Ioann_
Тогда все хорошо, потому что я про это скоро забуду, мало ли чего у них там поменяется. Спасибо и Антону и Анатолию :)
Anonymous
Хей бейбы. У меня появилась больная фантазия, но что-то мне подсказывает, что подобное уже делали. Язык С с иммутабельными переменными и нормальным variable shadowing. Подобные попытки уже были?
Anonymous
В принципе одного нормального shadow'инга достаточно. Сейчас же нельзя делать так: const int a = 4; const int a = a * 10; а было бы весьма занятно
Antontsue
weak_ptr - это так, воспоминание о былой юности
А он нилится при смерти объекта?) сорян за тупой вопрос
Matwey
А он нилится при смерти объекта?) сорян за тупой вопрос
У него lock возвращает нулевой указатель
Anonymous
А он нилится при смерти объекта?) сорян за тупой вопрос
weak_ptr не влияет на счетчик, объект может умереть. Просто валидировать нужно вручную каждый раз
Antontsue
А ну норм, спасибо
Antontsue
А сто там внутри кстате? Счет мьютексом обмазан?
Antontsue
В шаредптр
Anonymous
зачем?
Иммутабельность переменных исключит проблемы в многопоточном программировании const int a = 4; const int a = a * 10; //старый a продолжит свою жизнь до тех пор, пока кто-то в нем нуждается. Просто произойдет отвязка от своего идентификатора конкретно в этой строке. Считай, что создалась новая переменная
Anonymous
Писать одновременно из разных потоков в одно и то же место нельзя. Но мы-то работаем только в read-only режиме и можем создавать переменные с теми же названиями локально, так что проблемы не будет
Aidar
weak_ptr не влияет на счетчик, объект может умереть. Просто валидировать нужно вручную каждый раз
ну хз, например нужно знать ему когда можно удалить кусок памяти
Aidar
объект то умрет а вот память нет
Anonymous
но пользоваться объектом категарически нельзя, все равно валидировать надо
Aidar
да я про то что там счетчик всетаки тикает
Aidar
там 2 счетчика
Anonymous
unique_ptr - только один объект может владеть ресурсом shared_ptr - на ресурс можно ссылаться из нескольких мест, причем ресурс будет уничтожен только тогда, когда умрет последний потребитель ресура weak_ptr - может ссылаться на shared_ptr, но он никак не влияет на время смерти ресурса. Если все привязанные shared_ptr умрут, то weak_ptr станет невалидным
Anonymous
там у всех этих умных указателей по идее переопределен каст в bool, так что тупо через if можно чекнуть
Anonymous
объект то умрет а вот память нет
а если построить через weak_ptr shared_ptr ПОСЛЕ гибели последнего shared_ptr, то что произойдет?
Anonymous
я с weak_ptr особо не работаю просто, вот интересно стало
Anonymous
std::shared_ptr<T> lock() const noexcept; оно исключения не кидает
Aidar
If there is no managed object, i.e. *this is empty, then the returned shared_ptr also is empty.
Andrei
там у всех этих умных указателей по идее переопределен каст в bool, так что тупо через if можно чекнуть
Не стоит. У всех у них определен comparison с nullptr, поэтому лучше писать ```if(smartPtr != nullptr)```
Anonymous
ага, понял
Aidar
>Return value A shared_ptr which shares ownership of the owned object if std::weak_ptr::expired returns false. Else returns default-constructed shared_ptr of type T.
Anonymous
а на практике когда это может пригодиться? Ну, в реальной задачке?
Andrei
shared_ptr вообще в реальной задаче нужны как правило исключительно редко. Но для ленивых программистов подойдёт.
Aidar
Andrei
Не в этом дело. А в отсутствии ясного лайфтайма у ресурса.
Anonymous
у меня на ум приходит только какой-нибудь менеджер ресурсов. Типа в map хранить weak_ptr, но во время запроса ресурса выплевывать shared_ptr. Если ресурс уже помер - создать заново
Anonymous
или это bad case?
Andrei
Кейс использования шаред-птр, это когда есть две равнозначные сущности, которым надо владеть одним ресурсом.
Andrei
Например два треда и одна память, или два класса, с доступом к файлу.
Anonymous
это понятно, я просил реальную задачку :)
Aidar
Не в этом дело. А в отсутствии ясного лайфтайма у ресурса.
да просто тогда на них удобно делать локфри контейнеры
Andrei
Но даже эти кейсы в общем-то решаются введением менеджера ресурса с unique_ptr-ом и внятным временем жизни.