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

Откуда: loopback
Сообщений: 49762
Вот хорошее дефолтное поведение для компиллятора.

int i = {};


Для всех диких переменных сделали бы так. Убудет штоли? Или лишние такты процессора жалко?
Что там этот лысый дядечка? Держится за старое? Компатибилити?
30 окт 20, 01:10    [22223307]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
booby
Member

Откуда:
Сообщений: 2254
mayton,

а почему тебя ломает написать это своими ручками?
Без этого слово "вечность" не соберется, так и поедешь к Герде цветы поливать.

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

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

myFunction() {
`````
} 

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


Никакие addref, release делать не нужно.

Хм, а чё это у вас ф-я в глобале, а не в наследуемом классе, м?
Тогда бы и указатель не нужен был.
Надо просто за правило взять, что указатели в C++ - это плохо.
вот, тоже правильно пишет:
Dima T
Скажем так: не рекомендуется использовать. Можно потому что указатель под капотом тех же умных указателей и прочих классов STL.
Указатели даже для С++ это рудимент унаследованный из С, в С++ изначально ввели ссылки чтобы хоть как-то проблемы с указателями сгладить, но указатели оставили.


Сообщение было отредактировано: 30 окт 20, 01:36
30 окт 20, 01:38    [22223316]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Я не про это. Я говорю что делать с наследием? С тысячами исходников которые уже написаны
так

int i;


и наследуют поведение кота Шрёдингера.
30 окт 20, 01:38    [22223317]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
booby
Member

Откуда:
Сообщений: 2254
mayton,
если без смеха, то моему глазу милее инициализация с круглыми скобками - int i3(42);
просто потому, что по смыслу письма, эта форма означает вызов параметризованного конструктора.
Что в меня гораздо проще въезжает.
30 окт 20, 01:39    [22223318]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
booby
Member

Откуда:
Сообщений: 2254
mayton
Я не про это. Я говорю что делать с наследием? С тысячами исходников которые уже написаны
так

int i;


и наследуют поведение кота Шрёдингера.

Для богов это не имеет значения.
Кот Шредингера, как и Чеширский - часть мира.
Отражающая факт присутствия в мире неопределенного поведения по вине богов
30 окт 20, 01:42    [22223319]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
Алексей Роза 2020
Member [заблокирован]

Откуда:
Сообщений: 247
int i3 = 43; // уже совершенно НЕпонятно, чё тут происходит
30 окт 20, 01:42    [22223320]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
booby
Member

Откуда:
Сообщений: 2254
Алексей Роза 2020
int i3 = 43; // уже совершенно НЕпонятно, чё тут происходит

Это правда, хороший вопрос.
По сути вопрос о том, как правильно писать свой operator=
И как он связан с copy-constructor, move и swap.

Конечно, хорошо было бы, чтобы в этом месте о вкусе устриц высказались те, кто их ел.
:)
30 окт 20, 02:58    [22223330]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Алексей Роза 2020,
Сам не хотел такую архитектуру, да либа заставила.
Если ее первой не воткнуть до всего всего кода то не компилируется.
Я так понял, что конфликты с заголовками Qt.
Чей вперед заголовок тот и побеждает.
Не знаю как решить, а так работает.
30 окт 20, 07:40    [22223346]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
PetroNotC Sharp
Алексей Роза 2020,
Сам не хотел такую архитектуру, да либа заставила.
Если ее первой не воткнуть до всего всего кода то не компилируется.
Я так понял, что конфликты с заголовками Qt.
Чей вперед заголовок тот и побеждает.
Не знаю как решить, а так работает.

Вот похожая проблема с другой либой
автор
Я обнаружил, что с OpenCV 3 замена порядка заголовков включает так, чтобы opencv2 / opencv.hpp был включен до того, как какие-либо заголовки Какао также позволяют избежать ошибки компилятора. - MoDJ 31 дек.
Была такая же проблема с разными комбинациями заголовков. - JE42 06 июля '16 в 13:45
Использование #undef checkперед включением opencv.hppможет устранить ошибку. Это полезно в смешанной среде Swift / obj-C, где вы не всегда можете перетасовать порядок включения. - acj 24 августа '16 в 14:07

https://stackoverflow.com/questions/31665095/xcode-error-compiling-c-expected-member-name-or-after-declaration-specifie
30 окт 20, 07:57    [22223349]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
Dima T
Member

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

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

Про скобки и прочие способы явной инициализации понятно. Стек пока тоже оставим в стороне.

Зачем? Чтобы меньше косячить тем кто не привык писать на С++, например ТСу, привыкшему в C# что по-умолчанию ноль.

Допустим производительность некритична, и просто хочется перегрузить оператор new так
void *operator new(size_t size) {
    //void *p = malloc(size);
    void *p = calloc(size, 1);
    if (p == NULL) {
        throw std::bad_alloc();
    }
    return p;
}

Также прочие виды new по аналогии.

Но поможет ли это ему если он использует Qt ?
30 окт 20, 08:15    [22223355]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Dima T,
А что? Это инициализирует все все поля в классе?
И дату и строку и числа и....
30 окт 20, 08:36    [22223357]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
Dima T
Member

Откуда:
Сообщений: 15282
PetroNotC Sharp
Dima T,
А что? Это инициализирует все все поля в классе?
И дату и строку и числа и....

Да. Это выделение памяти под объект, т.е. под все его поля. http://www.amse.ru/courses/cpp2/2011_03_21.html
Штатно malloc() дает кусок памяти с мусором, замена на calloc() приведет к тому что мусор заменится на нули.
Далее там где явно инициализация прописана - проинициализируется согласно прописанному, что не прописано - останется с нулями.

Вот только я не уверен что Qt будет вызывать этот перегруженный new.
30 окт 20, 08:45    [22223358]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
Dima T
Member

Откуда:
Сообщений: 15282
Тут еще такой момент: если Qt использует свой перегруженный new, то если мы его подменим - он не будет вызываться.
Вот еще статья про перегрузку https://habr.com/ru/post/490640/

PS Я перегрузкой не пользуюсь, поэтому только в теории про нее знаю.
30 окт 20, 08:57    [22223363]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Dima T,
Имхо для Qt оверхед
30 окт 20, 09:28    [22223375]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
PetroNotC Sharp
Member

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

Сообщение было отредактировано: 30 окт 20, 09:24
30 окт 20, 09:28    [22223376]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10760
PetroNotC Sharp
Имхо для Qt оверхед
Вы уже определитесь - или вам инициализированные объекты или "оверхед".
30 окт 20, 10:50    [22223429]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Basil A. Sidorov
PetroNotC Sharp
Имхо для Qt оверхед
Вы уже определитесь - или вам инициализированные объекты или "оверхед".

Я давно определился.
Оверхед обозначает "компромисс МЕЖДУ правильностью и затратами на это".
Так как инициализация без new, то определитесь что вы лично предлагаете.
30 окт 20, 11:29    [22223447]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
booby
Member

Откуда:
Сообщений: 2254
Алексей Роза 2020
...
Хм, а чё это у вас ф-я в глобале, а не в наследуемом классе, м?
...

Рискну переформулировать эту идею и изложить её в императивной форме:

Нигде не используй классы QT в своем коде напрямую.

Создай свои классы-прослойки, со своими, тебе конкретно полезными конструкторами,
и в своем коде используй только эти интерфейсы-оболочки, лежащие в собственных файлах.
Изолируй зависимости в первую очередь.

А уж там наследование окажется или агрегация внутри - дело вторичное по отношению с сплошному
растягиванию по коду зависимостей от QT, непрерывных проблем инициализации и порождению
проклятия перехода на "новую версию чужой библиотеки".

это же очевидное дело - взялся взаимодействовать с чужой библиотекой - сначала отгородись от неё забором.
Взаимодействуй с чужой библиотекой только через управляемые тобой окошки и дверки.
Тогда то, что происходит позадь забора, не будет тревожить твой собственный огород, кроме, может быть,
вопроса о выборе цвета краски для любимого забора.
30 окт 20, 12:04    [22223465]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
booby
mayton,
если без смеха, то моему глазу милее инициализация с круглыми скобками - int i3(42);
просто потому, что по смыслу письма, эта форма означает вызов параметризованного конструктора.
Что в меня гораздо проще въезжает.


Вы согласны писать на 1 символ больше? Всегда? И просто из чувства прекрасного?
Из осознания того что работает конструктор?
30 окт 20, 12:06    [22223467]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
booby
Member

Откуда:
Сообщений: 2254
mayton,

:))
обычно я согласен писать то, что сам способен прочитать без затруднений.
30 окт 20, 12:10    [22223468]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
booby,
-1
Qt это не просто либа. Это фреймворк-платформа. Она диктует архитектуру. Как хибер в java или спринг.
То есть наоборот.
Везде используй QtObject QString а не std::string и т.д.
Если буст, то там свои законы.
30 окт 20, 12:10    [22223469]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
Dima T
Member

Откуда:
Сообщений: 15282
PetroNotC Sharp
Basil A. Sidorov
пропущено...
Вы уже определитесь - или вам инициализированные объекты или "оверхед".

Я давно определился.
Оверхед обозначает "компромисс МЕЖДУ правильностью и затратами на это".
Так как инициализация без new, то определитесь что вы лично предлагаете.

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

Я ссылки давал, мог бы почитать
http://www.amse.ru/courses/cpp2/2011_03_21.html
Переменная объектного типа в динамической памяти создаётся в два этапа:
1. Выделяется память с помощью оператора new.
2. Вызывается конструктор класса.

Без п.1 просто негде будет объект создавать, п.2 по мере необходимости, т.е. только то что явно в коде задано.
30 окт 20, 12:12    [22223471]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
booby
Member

Откуда:
Сообщений: 2254
PetroNotC Sharp,

как скажешь...
30 окт 20, 12:16    [22223472]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно вызвать указатель на функцию с парам строкой?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Dima T,
Я тоже тебе дал псевдокод
myFunction() {
`````
}

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

Где перегрузить new и поможет ли это коду выше?
30 окт 20, 12:28    [22223485]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
Все форумы / C++ Ответить