С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
43 / 43 / 5
Регистрация: 12.11.2011
Сообщений: 445

Использование #define для доступа к элементам класса

17.01.2015, 15:34. Показов 1914. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Имеется класс вида:
C++
1
2
3
4
5
class Test
{
int key;
int smth;
}
И я хочу сделать #define чтобы быстро получать доступ типа

C++
1
#define FastParse(a) (g_ClassVariable.a)
И в коде

C++
1
2
3
    char key[] = "smth";
    NPVariant arg;
    DOUBLE_TO_NPVARIANT((double)(int)FastParse(key), arg);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.01.2015, 15:34
Ответы с готовыми решениями:

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

Записать синтаксис объявления и определения свойства класса для доступа к элементам двухмерного массива данны
Записать синтаксис объявления и определения свойства класса для доступа к элементам двухмерного массива данных

Получение доступа к элементам Controller в JavaFX из другого класса
Доброго время суток! Проблема заключается в следующем, при попытки создать экземпляр класса Controller и обратится к элементам @FXML из...

19
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
17.01.2015, 15:36
С++ геттеры/сетеры 1 страничка любой книги по ООП С++
1
43 / 43 / 5
Регистрация: 12.11.2011
Сообщений: 445
17.01.2015, 15:42  [ТС]
Немного не то, если быть точным то у меня структура с кучей переменных, типа настроек.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
17.01.2015, 15:44
Цитата Сообщение от Micro Посмотреть сообщение
у меня структура с кучей переменных
И что это меняет?
0
43 / 43 / 5
Регистрация: 12.11.2011
Сообщений: 445
17.01.2015, 15:49  [ТС]
У меня идет внешний доступ в длл. В функцию идет параметр типа char[] key как в примере выше. И кучу if then не хочется копипастить. Если я что-то не так понял - покажите пример. Спасибо.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
17.01.2015, 15:54
Цитата Сообщение от Micro Посмотреть сообщение
И кучу if then не хочется копипастить.
Если множество переменных конфига статическая, то написать на каждый параметр геттер/сеттер, и не греть голову.
Если конфиг динамический, то и использовать динамическую структуру типа std::map.
0
43 / 43 / 5
Регистрация: 12.11.2011
Сообщений: 445
17.01.2015, 15:57  [ТС]
Мне не нужны геттеры или сеттеры, переменные все типа public и свободно изменяются, я просто хочу упростить работу и сделать через #define как я описал выше
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
17.01.2015, 16:03
Цитата Сообщение от Micro Посмотреть сообщение
переменные все типа public и свободно изменяются
Тогда ничего не нужно делать.
Цитата Сообщение от Micro Посмотреть сообщение
упростить работу и сделать через #define как я описал выше
Цитата Сообщение от Micro Посмотреть сообщение
В функцию идет параметр типа char[] key как в примере выше.
Значение строки известно во время выполнения программы, имена полей — на этапе компиляции, макросы существуют до этапа препроцессинга. Переносите все либо в рантайм, либо на этап компиляции. И в чем упрощение — неочевидно. Возможно, нужна одна функция или метод — getParamByName, но в данном случае будет куча if-ов. Либо использовать std::map, но это, как я уже говорил, динамика.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
17.01.2015, 16:18
Я так и не понял в чём проблема...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
class Test
{
public:
    int key;
    int smth;
};
 
#define T_GET( m ) (t.m)
 
int main()
{
    Test t;
    T_GET( key ) = 123;
    std::cout << T_GET( key ) << std::endl;
    return 0;
}
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
17.01.2015, 16:21
Цитата Сообщение от castaway Посмотреть сообщение
Я так и не понял в чём проблема...
Если я правильно понял с объяснений, то у автора key — это строка, получаемая в рантайме из внешнего мира.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
17.01.2015, 17:01
Цитата Сообщение от 0x10 Посмотреть сообщение
Если я правильно понял с объяснений, то у автора key — это строка, получаемая в рантайме из внешнего мира.
Может быть.. К сожалению, автор плохо объясняет что ему нужно. Первый пост - это вообще сферический бордак мыслей в вакууме.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
17.01.2015, 17:40
Макросы раскрываются еще до компиляции, поэтому идея обречена на провал.

Добавлено через 1 минуту
По теме - создать map<key, value> где key - строка (получаемая из внешнего мира), value - ссылка на член класса. По ключу получаем ссылку, используем через объект.
0
43 / 43 / 5
Регистрация: 12.11.2011
Сообщений: 445
17.01.2015, 21:08  [ТС]
А можно пример?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.01.2015, 21:24
Цитата Сообщение от Micro Посмотреть сообщение
А можно пример?
Да тут многим не помешал бы пример того, что же действительно тебе нужно. И мне в том числе. Распиши поподробнее тот вариант кода, который
Цитата Сообщение от Micro Посмотреть сообщение
В функцию идет параметр типа char[] key как в примере выше. И кучу if then не хочется копипастить.
и, я думаю, можно будет предложить вариант его упрощения.
0
43 / 43 / 5
Регистрация: 12.11.2011
Сообщений: 445
17.01.2015, 22:19  [ТС]
Что-то типа настроек. Пара как string - ключ, int - значение
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.01.2015, 23:06
Цитата Сообщение от Micro Посмотреть сообщение
Пара как string - ключ, int - значение
Ну так std::map<std::string, int*> уже предлагали подобное в теме. Чем-то не устраивает?
0
43 / 43 / 5
Регистрация: 12.11.2011
Сообщений: 445
17.01.2015, 23:56  [ТС]
Дело в том что я попробовал уже это и от чего-то не получилось.
C++
1
int val = *maped[key];
как я делал маппинг
C++
1
2
3
    CFG_mapped.insert(std::pair<std::string, int*>("ow_a", &CFG.a));
    CFG_mapped.insert(std::pair<std::string, int*>("ow_b", &CFG.b));
    CFG_mapped.insert(std::pair<std::string, int*>("ow_c", &CFG.c));
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
18.01.2015, 00:12
Цитата Сообщение от Micro Посмотреть сообщение
и от чего-то не получилось.
Что не получилось конкретно? Ошибка компиляции/не то поведение? Демонстрация нужна в общем.
0
43 / 43 / 5
Регистрация: 12.11.2011
Сообщений: 445
18.01.2015, 00:15  [ТС]
C++
1
int val = *(int*)CFG_mapped[param];
Краш
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
18.01.2015, 00:20
Micro, надо больше кода. По имеющемуся могу лишь сказать, что приведение к int* не нужно и падение проги будет, если мапа не содержала (или содержала нулевой указатель) значения с ключом param. Для защиты от крэша можно добавить проверку:
C++
1
2
3
4
if( CFG_mapped.find(param) == CFG_mapped.end() )
{
// not found
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.01.2015, 00:20
Помогаю со студенческими работами здесь

friend функции не имеют доступа к private элементам класса, почему?
Учусь по Лафоре Р. - Объектно-ориентированное программирование в С++ (Классика Computer Science) - 2004. Выполняю задания на Microsoft...

Как реализовать директиву #define для создания шаблона отпределения #define ?
Здравствуйте уважаемые. При написании программы появилась необходимость задать шаблон создания #define через #define (извините за...

Напишите цикл for для доступа к элементам массива в обратном порядке
Правильно ли? #include &lt;iostream&gt; using namespace std; int main() { int size; cout &lt;&lt; &quot;Enter number: &quot;; cin...

Использование вектора для присваивания значений элементам структуры
Здравствуйте, форумчане. Сразу отмечу, что я новичек, так что, возможно, мой вопрос покажется вам слегка туповатым, но все же: Имеется...

Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса
Здравствуйте! Можно ли использовать перегруженный оператор ввода/вывода в поток из базового класса для объекта производного класса, если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru