Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для Arkaniy
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453

Прямой доступ к переменным

29.05.2014, 23:32. Показов 3162. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, форумчане. Сразу оговорю, что название темы может не совсем корректно раскрывать суть вопроса.

Начну с аналога в PHP, где можно писать вот так
PHP
1
2
3
$b = 'a';
$a = 2;
$$b = 3; // $a=3
Есть такой способ доступа к переменным. Как такое сделать в С++?
Приведу свой пример.
Есть структура и функция в которую нужно передать адрес поля структуры. Но поле это выбирает пользователь. Можно конечно навешать
C++
1
2
3
4
if(param == "pole_1")
    foo(&myStuct::pole_1);
else if
    ...
но как-то и смотрится не очень. Может есть способ обойти эти условия?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.05.2014, 23:32
Ответы с готовыми решениями:

Доступ к переменным
Есть иерархия классов: class base{ int a; }; class der : private base{ void f(){ //Необходимо использовать переменную...

Доступ к переменным класса
Давным давно помню была такая фишка в сях, когда приходилось много раз писать конструкцию типа "VarName->member()" можно было...

Доступ из статической функции к не стачисеским переменным
Добрый день! Имеется класс со статической функцией, как получить доступ, из это функции к не статичным переменным. Что то типа этого: ...

30
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.05.2014, 01:07
Arkaniy, если честно не понял при чём доступ. По примерам из пи-эйч-пи можно подумать, что речь о явном и не явном определении типа. Я и подумал. Тогда можно сказать, что до C++11 возможности использования переменной без предварительного явного объявления типа нет. Начиная с C++11 есть возможность неявного определения в выражениях совмещающих объявление и присваивание (инициализацию):
C++
1
2
3
auto a = 5; //int
auto b = 5.0//double
auto c = 5f//float
http://habrahabr.ru/post/182920/
но это упрощение не отменяет, а упрощает определение типа (несколько затрудняя работу компилятора)).
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
30.05.2014, 02:05
Лучший ответ Сообщение было отмечено Arkaniy как решение

Решение

IGPIGP, на сколько я понял,ТС спрашивает о ссылках
C++
1
2
3
int val = 42;
int &ref = val; // ref - синоним val
std::cout<<ref;
если же нужно обращение по содержимому в ref, то можно использовать std::map
C++
1
2
3
4
5
6
7
8
9
10
#include <map>
#include <string>
 
typedef map < std::string, int > str2val;
 
str2val values;
values["number"] = 42;
std::string ref = "number";
 
func(values[ref]);
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.05.2014, 03:44
Cra3y, да похоже Вы правы. Но если в PHP можно заселить переменную именем переменной:
PHP
1
2
3
4
$b = 'a';//литерал 'а' может быть просто строка, но как видно далее используется 
//для доступа к переменной с именем a (нетипизированным на момент появления) 
$a = 2;//неявно типизированная переменная, живёт самостоятельно
$$b = 3;//добрались до a и присвоили 3
то в плюсах этого нет. Статическая типизация не позволяет. Или я опять не вруб?

Добавлено через 11 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
Статическая типизация
Ну, то есть, в конечном счёте, определяющим является отличие компилятора в котором строк имён в коде уже нет и интерпретатора для которого листинг читается во время исполнения. Первому нужно иметь определённые типы до компиляции, второму не обязательно их иметь до трансляции.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
30.05.2014, 03:54
Arkaniy, конкретно по имени ятп никак, это вам не пыха-руби с eval'ами.
C++
1
2
3
int a = 2;
int* b = &a;
*b = 3; // a=3
2
 Аватар для Arkaniy
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
30.05.2014, 17:58  [ТС]
Спасибо всем отписавшимся! Особое спасибо Cra3y
Map'ом и воспользуюсь. Решение довольно простое. Даже грустно, что сам к этому не пришел.

Добавлено через 56 минут
И еще возник вопрос. Как сделать map для пар string - int, string - string? Тоесть так, чтобы значения могли быть разных типов. Вообще если так возможно. Нашел тут темку с этим вопросом, но ответ был исчерпывающим и отрицательным. Но тема 2009 года и может есть что-то из 11 стандарта.
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
30.05.2014, 18:08
Хм.. например использовать boost::variant
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
30.05.2014, 18:13
Arkaniy, если бы как в том же .Net все классы реализовывали бы object, то можно было бы сделать map на object, но в плюсах - хз. Мб может получиться извратиться в void* указателями, но тут уже хз
Миниатюры
Прямой доступ к переменным  
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.05.2014, 19:15
Как сделать map для пар string - int, string - string?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
map<string, string> string_pair;
string_pair.insert(pair<string, string>("0","zero"));
string_pair.insert(pair<string, string>("1","one"));
string_pair.insert(pair<string, string>("2","two"));
map<string, string>::const_iterator were_it;
were_it = string_pair.find ("1");
cout <<"Key " << were_it->first << " Value " << were_it->second << endl;
system("pause") ;
return 0;
}
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
30.05.2014, 19:59
IGPIGP, я так понял, что в качестве key хочется иметь строку, а в качестве value - число, строку или еще что. то есть а-ля:
C++
1
2
3
map <string, sometype> dict;
string_pair.insert(pair<string, sometype>("0","zero"));
string_pair.insert(pair<string, sometype>("1",42));
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.05.2014, 20:11
Цитата Сообщение от Psilon Посмотреть сообщение
IGPIGP, я так понял, что в качестве key хочется иметь строку, а в качестве value - число, строку или еще что. то есть а-ля:
Дык, или то или другое.
Я сначала <int, string> выложил, а потом вычитал, что ключом должна быть строка и предложил <string, strng>. С типами <string, int> та же история.
Конечно если ключ - целое, то быстрее будет.
Psilon, если честно мне непонятно как выбирается поле структуры и зачем передавать адрес поля, а не указатель на экземпляр например. Вообще, в простых случаях можно делать по старинке: объявлять перечисление и массив строк. Тогда в коде можно найти строку используя имя константы как индекс (если декорировать объявление уточняющим типом перечисления). То есть может выглядеть Arr_str[one] (значение вроде "first_val" или просто "one", в зависимости от того что в массиве строк положили).
А поиск по индекса по строке, - руками. Но со словарём поддержка методов класса есть. Так, что дело вкуса.
0
 Аватар для Arkaniy
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
30.05.2014, 22:01  [ТС]
Psilon, с void пытался. Ругается при компиляции
Code
1
error: cannot declare pointer to 'void' member
IGPIGP, то есть просто представлять числа в виде строк? Вот тут что-то не понял. Для вывода на экран конечно пойдет, но а если делать арифметические вычисления?
Поле структуры выбирает пользователь. Можно конечно сделать блок условий, как я писал в первом посту, но если полей 10? Писать 10 условий? Вот и задался вопросом выбора поля по введенной строке. Вариант с асоциативным массивом подходит, но тут уже не клеится с другой стороны. Почему передавать поле, а не экземпляр? Потому что нужно именно поле. При каждом вызове пользователь должен определять сам к какому полю обращаться. Хотя может я вообще велосипед делаю... А вот как делать по старинке не сообразил что-то
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
30.05.2014, 23:24
IGPIGP, ну на примере C# это сделать можно легко. Пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
            var dict = new Dictionary<string, object>();
 
            dict.Add("0", "Hello");
            dict.Add("1", 42);
 
            // что-то делаем
 
            string s = (string) dict["0"];
            int i = (int) dict["1"];
 
            Console.WriteLine(s);
            Console.WriteLine(i);
такие дела
0
 Аватар для Arkaniy
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
30.05.2014, 23:50  [ТС]
Psilon, а на сценарных языках еще проще, но ведь не об этом
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
31.05.2014, 00:57
Arkaniy, плюсы и шарп очень похожи, на самом деле. Шарп - это такие плюсы "с человеческим лицом" Поэтому практически уверен, что на них можно сделать подобным образом все (тем более, что типобезопасность в плюсах намного слабее), просто мы о таком способе не знаем

Не по теме:

А сценарные языки вообще не ок. За исключением разве что sql и js :)



Добавлено через 3 минуты
Arkaniy, если верить гуглу, можно соорудить что-то вроде такого
C++
1
typedef map<std::string,boost::variant<int, std::string>> str2any
2
 Аватар для Arkaniy
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
31.05.2014, 01:31  [ТС]
Psilon, с бустом вообще не знаком. Ладно, буду копать туда значит. Спасибо

Не по теме:

По поводу сценарных полностью согласен :drink:

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
31.05.2014, 01:31
Цитата Сообщение от Arkaniy Посмотреть сообщение
IGPIGP, то есть просто представлять числа в виде строк?
Пара в мапе может быть любой но определенной вначале. Может быть map<string, int> тоже.
А если:
Цитата Сообщение от Cra3y Посмотреть сообщение
Хм.. например использовать boost::variant
то есть:
Цитата Сообщение от Psilon Посмотреть сообщение
Arkaniy, если верить гуглу, можно соорудить что-то вроде такого
C++
1
typedef map<std::string,boost::variant<int, std::string>> str2any
то и то и другое.
Но мне кажется лучше бы задачу увидеть. Расскажите, интересно же.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
31.05.2014, 01:33
IGPIGP,
Хм.. например использовать boost::variant
то есть:
слона-то я и не приметил
В смысле полез в гугл, хотя на предыдущей странице уже ответили)
0
 Аватар для Arkaniy
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
31.05.2014, 01:46  [ТС]
IGPIGP, про пару в мапе знаю, но мне же нужно чтобы ключ был стрингом, а значение перенным типом.
Я тот пост заметил, но попытал счастья в обход буста
А задача, собственно, простая.
Придумал себе структуру фильм. Поля такие как режиссер, год, страна и т.д. Как видно, есть и строковые поля, и чиловые. Нужно достать из массива только те фильмы, которые отвечают параметрам запроса пользователя. К примеру, все фильмы 2000 года.
Вот и получается, что нужно смотреть именно по полю год. Вот это поле и нужно передать в ф-цию. С этим разобрались, да поля-то разных типов и не ясно было как в мап засунуть эти значения.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
31.05.2014, 01:46
Цитата Сообщение от Psilon Посмотреть сообщение
слона-то я и не приметил
Дык, я сам грешу этим часто.
Понимаешь, не пойму как пользователь поля выбирать будет. Для меня структура, запись, строка таблицы, это квант какой-то общей сущности. Матрица её описания, что ли. То есть у слона есть уши, хобот и хвост. Как тут выберешь. Если украшать его цветами, например, то придётся как-то по очереди. Я бы начал с ушей... А что-то можно и не украшать. Но это логика какой-то внутренней процедуры, - "эки-слоно-бана", например. А пользователю нужно бы разрешить выбирать слона. Большого, маленького или... жирафа. А процедура должна соответствовать выбору. Хотя в жизни всяко бывает. Хочется узнать зачем выбирать поле и передавать его по ссылке.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.05.2014, 01:46
Помогаю со студенческими работами здесь

Доступ к переменным базового класса при наследовании
Есть следующий код class Base { protected: int x; Base* enemy; public: Base() {}

Доступ к переменным в DLL программе из внешних програм
Подскажите пожалуйста, как реализовать Записать данные из программы №1 в программу DLL и считать данные из DLL программой №2 По...

Friend функции не имеют доступ к закрытым переменным
Всем привет. Изучаю c++ по Липпману 5-ое издание. Там на стр. 351-352 используются friend функции для получения доступа к закрытым...

Прямой доступ к видеопамяти
Требуется написать программу, которая будет напрямую обращаться в видеопамяти. Описание: Реализовать функцию, принимающую три...

Прямой доступ к видео памяти
Здравствуйте, подскажите как организовать прямой доступ к видео памяти на современно VGA/DVI видео адаптере. В Книги Шилдта есть указания...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru