Вопрос про this

Модератор: Модераторы разделов

Ответить
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Вопрос про this

Сообщение devilr »

Доброго времени суток!
Имеется структура:

Код: Выделить всё

    typedef struct DATA
    {
        int index;
        QString text;
        bool (MyClass::*func)(void);
    } *data_t;
    QList<DATA> commands;

и заполнение оной, что-то типа:

Код: Выделить всё

	int id = 0;
	commands.append({ id++, "test",             &MyClass::test });
	commands.append({ id++, "test1",           &MyClass::test1 });
	commands.append({ id++, "test2",           &MyClass::test2 });
При этом MyClass - это класс, в котором это всё и живёт. Можно как то избавиться от использования MyClass в структуре и заполнении? Просто так ведь заменить MyClass на this не получится. Или получится?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Вопрос про this

Сообщение Bizdelnick »

devilr писал(а):
05.08.2020 23:30
MyClass - это класс, в котором это всё и живёт
Недопонял, что означает этот оборот. Если то, что
devilr писал(а):
05.08.2020 23:30

Код: Выделить всё

	int id = 0;
	commands.append({ id++, "test",             &MyClass::test });
	commands.append({ id++, "test1",           &MyClass::test1 });
	commands.append({ id++, "test2",           &MyClass::test2 });

находится внутри какого-то метода MyClass, то здесь, вроде бы, можно использовать this.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Вопрос про this

Сообщение devilr »

Bizdelnick писал:
06.08.2020 00:24
Недопонял, что означает этот оборот.
Русский язык - он велик и могуч. Ну и "мысль изречённая есть ложь".
Имелось в виду, что всё - инициализация структуры и использование оной находятся внутри класса MyClass. Т.е. других классов нет.
И, если в самой структуре я могу написать
bool (*func)(void);
то вот с присваиванием будет проблема.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Вопрос про this

Сообщение ormorph »

Вы пытаетесь использовать методы си в C++. Вроде же можно объявлять методы в структуре и не мучаться с указателями на методы.
Спасибо сказали:
IMB
Сообщения: 2559
ОС: Debian

Re: Вопрос про this

Сообщение IMB »

Есди это определение параметров callback, то в C++ есть https://en.cppreference.com/w/cpp/utility/functional/function
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Вопрос про this

Сообщение devilr »

ormorph писал(а):
06.08.2020 07:06
Вроде же можно объявлять методы в структуре и не мучаться с указателями на методы.
Можно. Но тогда, фактически, надо будет весь класс в структуру перенести. А зачем?
Логика в том, что я описываю класс с, например, 10 однотипными функциями (все возвращают bool и не имеют входных параметров). Затем создаю и заполняю ту структуру, которую и приводил выше. А дальше использую функции, используя данные из структуры. Например, если делать меню или выпадающий список для выбора этих функций. Получается нагляднее, компактнее и удобнее, на мой взгляд. Единственное, что коробит мой глаз - это 10 упоминаний &MyClass::testX в заполнении структуры. Но, похоже, по другому никак. :(
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Вопрос про this

Сообщение ormorph »

devilr писал(а):
06.08.2020 10:52
Можно. Но тогда, фактически, надо будет весь класс в структуру перенести. А зачем?
Да как бы незачем, просто в структуре создаётся указатель типа MyClass, и в каждую структуру делается ссылка на this, а вызывать уже можно будет любую функцию.
Объявление:

Код: Выделить всё

    typedef struct DATA
    {
        int index;
        QString text;
        MyClass *A;
        bool func() {return true;} //код на ваше усмотрение вызов  *A
    } *data_t;
    QList<DATA> commands;
Заполнение:

Код: Выделить всё

    int id = 0;
    commands.append({id++, "text", this});
Второй вариант смотреть в сторону макросов. Основное назначение макроса - подставить код в месте вызова макроса.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Вопрос про this

Сообщение devilr »

ormorph, в вашем примере функция func - это всего 1 строка. А теперь представьте, что таких функций будет 10, строк по 50 в каждой. Решение так себе...
Макрос - это всего лишь запутывание кода и усложнение отладки. Да и короче то ведь не будет.
P.S. Проблема ведь не столько в том, как это записать в структуру, а в том, как это "красивее" вызвать потом.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Вопрос про this

Сообщение ormorph »

devilr писал(а):
06.08.2020 13:53
ormorph, в вашем примере функция func - это всего 1 строка. А теперь представьте, что таких функций будет 10, строк по 50 в каждой. Решение так себе...
Ну мне если честно, трудно вообще понять смысл вызова функции класса из структуры и какие оно может дать приемущества. А так на пример функция func может считывать id из структуры и на основании значения вызывать соответствующую функцию из класса(используя указатель). Все это можно оформить switch. Так что ни чего лишнего и особо сложного не потребуется.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Вопрос про this

Сообщение devilr »

ormorph, в вашем случае просто сложнее получается, как по мне. Раньше я именно так и делал. А теперь я просто пишу функции в классе и заполняю свою структуру (как в первом посте). А потом, когда надо, например, вызвать какую то функцию, я просто ищу нужный индекс в структуре, нахожу там указатель на функцию и запускаю её. Фактически, даже переключатель не всегда нужен.
Хотя, на вкус и цвет все фломастеры разные, тут не спорю. :)
Добавлено (14:23):
ormorph писал(а):
06.08.2020 14:10
Ну мне если честно, трудно вообще понять смысл вызова функции класса из структуры и какие оно может дать приемущества.
Задачи просто разные бывают. Как и заказчики.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Вопрос про this

Сообщение Bizdelnick »

ormorph писал(а):
06.08.2020 07:06
можно объявлять методы в структуре
devilr писал(а):
06.08.2020 10:52
надо будет весь класс в структуру перенести
Не то чтобы можно, и не то чтобы надо, просто структура и класс — это в плюсах синонимы. Если смотреть на всё как на классы, может оказаться проще жить. В частности, можно наследовать методы вместо извращения с использованием методов другого класса.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Вопрос про this

Сообщение devilr »

Bizdelnick писал:
06.08.2020 14:53
В частности, можно наследовать методы вместо извращения с использованием методов другого класса.
Можно. Вот только у меня это один и тот же класс. Даже в описании структуры он один. И я думал, что можно как то хитро дать понять компилятору, что в моём случае, в указателе нет особой надобности указывать класс... а на деле получается, что надо.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Ответить