Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51774

Алексей Роза 2020
в C++ же конструкторы этим занимаются, которых не было в C.
И они же гарантируют, что не будет мусора.

Занимаются если они написаны. Гарантируют они ровно то, что в них написано.

Posted via ActualForum NNTP Server 1.5

29 окт 20, 18:04    [22223107]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
Dima T
Member

Откуда:
Сообщений: 15282
PetroNotC Sharp
А как вы проверите что там мусор и объект не полностью готов?

Никак, это заранее надо предусмотреть разработчику класса. ООП гласит что объект сразу должен быть инициализирован, но если разработчик решает что некоторые поля могут быть инициализированы мусором, то почему нет?

Вот так сложилось в С++ что по умолчанию это инициализация мусором и менять это в стандарте вряд ли кто захочет.
29 окт 20, 18:07    [22223108]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
booby
Member

Откуда:
Сообщений: 2254
Dima T
... ООП гласит что объект сразу должен быть инициализирован...

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

Но нечто подобное, действительно, гласят, некоторые интертрепаторы ООП и изобретатели "самых безопасных в мире языков".

Dima T

Вот так сложилось в С++ что по умолчанию это инициализация мусором и менять это в стандарте вряд ли кто захочет.

Думаю, что это исключено.
По крайней мере, при жизни Страуструпа.
Он, конечно, раб комитета, но не настолько, чтобы не суметь ему противостоять в принципиальных вопросах.

Сообщение было отредактировано: 29 окт 20, 18:10
29 окт 20, 18:13    [22223116]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Алексей Роза 2020
это же "naked pointer", который "НЕЛЬЗЯ"
не понял что это нельзя? Работает ведь.
29 окт 20, 18:37    [22223133]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
booby,
Мы выше выяснили, что полуобъект никакого смысла не имеет кроме скорости.
Что не подтверждено кодом профи).
Ну и в бизнес объектах добавляют флаг или перечислимое о том что он "сформирован"
29 окт 20, 18:41    [22223134]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
booby
Member

Откуда:
Сообщений: 2254
PetroNotC Sharp
...
Ну и в бизнес объектах добавляют флаг или перечислимое о том что он "сформирован"

это просто чепуха.
"добавляют", но почти всегда не от большого ума.

PetroNotC Sharp
booby,
Мы выше выяснили, что полуобъект никакого смысла не имеет кроме скорости.
...

Похоже, вы не вполне поняли о чем идет речь.
Забудьте про скорость.

Те, кто считает, что вопрос только в скорости, автоматически влепляют в систему типов дефолтную инициализацию до полного состояния.
Но, оказывается, в содержательных случаях, это левое движение, которое ни к чему не приближает.
Здесь за вас просто не делают левого движения.
Попробуйте испытать гордость.

Сообщение было отредактировано: 29 окт 20, 18:51
29 окт 20, 18:53    [22223141]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
Алексей Роза 2020
Member [заблокирован]

Откуда:
Сообщений: 247
PetroNotC Sharp
Алексей Роза 2020
это же "naked pointer", который "НЕЛЬЗЯ"
не понял что это нельзя? Работает ведь.

Страуструп против:
NO naked pointers (Страуструп):
a) keep them inside functions and classes; (тут имеется ввиду, что в классах будут RAII и прочие shared-ptrs)
b) keep arrays out of interfaces (prefer containers);
c) pointers are implementation-level artifacts;
d) a pointer in a function should not represent ownership;
e) always consider std::unique_ptr AND sometimes std::shared_ptr;

// правила Herb Sutter:
1. prefer to allocate heap objects using make_unique/make_shared or containers.
2. otherwise, use owner<> for source/layout compatibility with old code.
Each non-null owner<> must be deleted exactly once, or moved.
3. Never dereference a null or invalid Pointer.
4. Never allow an invalid Pointer to escape a function.

Dimitry Sibiryakov
Алексей Роза 2020
в C++ же конструкторы этим занимаются, которых не было в C.
И они же гарантируют, что не будет мусора.

Занимаются если они написаны. Гарантируют они ровно то, что в них написано.

мы же про C/C++ говорим, зачем повторять очевидное? C/C++ написаны так, что там ВСЁ зависит от программиста.
Но тысячи Core Guidelines как бэ намекают, что таки есть некие правила.

Сообщение было отредактировано: 29 окт 20, 18:59
29 окт 20, 19:03    [22223146]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
booby,
ОК, про скорость забыл.
Главное не забыть инициализировать).
Тут ведь третичная логика)). Да/нет/мусор
))
Уже второй раз натыкаюсь на грабли.
И IDE тоже нифига не помогает....в 21 веке.
Повешу красный плакат перед носом))
29 окт 20, 19:06    [22223147]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
Dima T
Member

Откуда:
Сообщений: 15282
PetroNotC Sharp
Алексей Роза 2020
это же "naked pointer", который "НЕЛЬЗЯ"
не понял что это нельзя? Работает ведь.

Скажем так: не рекомендуется использовать. Можно потому что указатель под капотом тех же умных указателей и прочих классов STL.
Указатели даже для С++ это рудимент унаследованный из С, в С++ изначально ввели ссылки чтобы хоть как-то проблемы с указателями сгладить, но указатели оставили.
29 окт 20, 19:12    [22223149]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
booby
Member

Откуда:
Сообщений: 2254
PetroNotC Sharp
...
Тут ведь третичная логика)). Да/нет/мусор
...

Здесь вы совершаете критическую ошибку.

языкам программирования трехзначная логика и неприменение закона исключения третьего запрещены
правительством США (это шутка, но с не сильно ошибочным содержанием).

Нет никакого Да/нет/мусор

Есть Да/нет/[неопределенное поведение], иначе см. на закон исключения третьего в п.1.
Задача "безопасных" языков свести это к Да/нет.

Вот и вся история.

Сообщение было отредактировано: 29 окт 20, 19:10
29 окт 20, 19:13    [22223150]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
Dima T
Member

Откуда:
Сообщений: 15282
PetroNotC Sharp
И IDE тоже нифига не помогает....в 21 веке.
Повешу красный плакат перед носом))

Помогает, но ненавязчиво
Dimitry Sibiryakov

Причём компилятор имеет привычку предупреждать об использовании неинициализированных переменных, но кто ж эти "многа букафф" читает?..
29 окт 20, 19:14    [22223151]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
booby
Member

Откуда:
Сообщений: 2254
мусор, не мусор - вот почему у меня время редактирования сообщения меньше времени его создания.
Вот это настоящий вопрос/
29 окт 20, 19:16    [22223152]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Алексей Роза 2020,
А если у меня указатель просто переход на функцию глобальную в модуле main?

myFunction() {
`````
} 

main(....
.... 
Class A a
a.pointerFunc = myFunction;

Никакие addref, release делать не нужно.
29 окт 20, 19:18    [22223153]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
Dima T
Member

Откуда:
Сообщений: 15282
booby
мусор, не мусор - вот почему у меня время редактирования сообщения меньше времени его создания.
Вот это настоящий вопрос/

Багофича sql.ru, ты не первый заметил 22208645
29 окт 20, 19:21    [22223154]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51774

Dima T
Помогает, но ненавязчиво

Поэтому лично я связкой "-Wall -Wextra -Werror" превращаю это в "навязчиво". И со времени,
когда я начал так делать, количество багрепов резко уменьшилось.

Posted via ActualForum NNTP Server 1.5

29 окт 20, 19:33    [22223158]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Dimitry Sibiryakov,
Мы не путаем варнинг Переменная не используется в коде и просто нарушена очередность вызова. Вызвано до инициализации.
Завтра проверю что она там мяукает.
29 окт 20, 19:46    [22223165]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51774

Хотя да, неинициализированные поля объектов оно не обнаруживает, к сожалению. Только
локальные переменные.

Posted via ActualForum NNTP Server 1.5

29 окт 20, 19:48    [22223169]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Dimitry Sibiryakov,
Да. И это жаль.
В методах оно задолбало так как всегда прототип пишешь, и только после цепляешь все параметры в бизнес логику кода.
29 окт 20, 19:56    [22223171]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
Dima T
Member

Откуда:
Сообщений: 15282
Мы тут долго обсуждаем почему не ноли, а можно что-то добавить чтобы в своем проекте сделать инициализацию нолями? Просто сделать для себя как хочется, а не как принято.

Глобально оператор new можно перегрузить и там прописать, а как быть с тем что на стэке размещается, типа
main(....
.... 
Class A a;
29 окт 20, 20:00    [22223174]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Как тут говорят - класс(структура) это святое! Не трожь и не посыпай никаким синтаксическим сахаром! (с) Страуструп.
29 окт 20, 20:00    [22223175]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Dima T,
Я в Qt пишу. И там new практически не используется.
Достаточно редко.
Вот такие пироги.
29 окт 20, 20:02    [22223177]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Dima T,

Да давно уже пора сделать. А кто хочет перформанса дать опции наподобие DEBUG, пускай он эту механику выключит там где ему сильно нужно.

Но я сомневаюсь что в мире ООП кто-то сильно оптимизирует создание объектов.
29 окт 20, 20:26    [22223192]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
Dima T
Member

Откуда:
Сообщений: 15282
PetroNotC Sharp
Dima T,
Я в Qt пишу. И там new практически не используется.
Достаточно редко.
Вот такие пироги.

Да, new это тоже опасный оператор, утечки памяти будут если накосячишь, поэтому используются обертки.
Может ошибаюсь, с Qt незнаком, но без new в куче объект не разместить, а с объектами на стэке тоже далеко не уедешь. Подозреваю что new там есть глубоко закопанное, другой вопрос можно ли туда докопать.
29 окт 20, 20:41    [22223202]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Скорее здесь стек играет роль презерватива.
29 окт 20, 20:59    [22223213]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
booby
Member

Откуда:
Сообщений: 2254
Dima T
Мы тут долго обсуждаем почему не ноли, а можно что-то добавить чтобы в своем проекте сделать инициализацию нолями? Просто сделать для себя как хочется, а не как принято.

Глобально оператор new можно перегрузить и там прописать, а как быть с тем что на стэке размещается, типа
main(....
.... 
Class A a;

как-то странно сам вопрос выглядит (вроде фигурные скобки уже были в топике).

вообще-то это "инициализацией" называют.
Вот рассказ как раз для фигурных скобок, например:
https://habr.com/ru/post/436296/

А вообще, если именно "на стеке" хочется, то вроде как в C++ больше принято для такого хотения дело со Struct иметь, не?

вот тут еще много букв с мультфильмами и перечислением 18 валидных способов инициализации целого
(из которых первый - как раз не полностью сформированный объект).
https://habr.com/ru/company/jugru/blog/469465/
30 окт 20, 00:58    [22223303]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
Все форумы / C++ Ответить