Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
29.05.2014, 23:32     Прямой доступ к переменным #1
Доброго времени суток, форумчане. Сразу оговорю, что название темы может не совсем корректно раскрывать суть вопроса.

Начну с аналога в 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
    ...
но как-то и смотрится не очень. Может есть способ обойти эти условия?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 284
Регистрация: 04.12.2011
Сообщений: 7,711
Записей в блоге: 3
30.05.2014, 01:07     Прямой доступ к переменным #2
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/
но это упрощение не отменяет, а упрощает определение типа (несколько затрудняя работу компилятора)).
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
30.05.2014, 02:05     Прямой доступ к переменным #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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]);
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 284
Регистрация: 04.12.2011
Сообщений: 7,711
Записей в блоге: 3
30.05.2014, 03:44     Прямой доступ к переменным #4
Cra3y, да похоже Вы правы. Но если в PHP можно заселить переменную именем переменной:
PHP
1
2
3
4
$b = 'a';//литерал 'а' может быть просто строка, но как видно далее используется 
//для доступа к переменной с именем a (нетипизированным на момент появления) 
$a = 2;//неявно типизированная переменная, живёт самостоятельно
$$b = 3;//добрались до a и присвоили 3
то в плюсах этого нет. Статическая типизация не позволяет. Или я опять не вруб?

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

Добавлено через 56 минут
И еще возник вопрос. Как сделать map для пар string - int, string - string? Тоесть так, чтобы значения могли быть разных типов. Вообще если так возможно. Нашел тут темку с этим вопросом, но ответ был исчерпывающим и отрицательным. Но тема 2009 года и может есть что-то из 11 стандарта.
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
30.05.2014, 18:08     Прямой доступ к переменным #7
Хм.. например использовать boost::variant
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
30.05.2014, 18:13     Прямой доступ к переменным #8
Arkaniy, если бы как в том же .Net все классы реализовывали бы object, то можно было бы сделать map на object, но в плюсах - хз. Мб может получиться извратиться в void* указателями, но тут уже хз
Миниатюры
Прямой доступ к переменным  
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 284
Регистрация: 04.12.2011
Сообщений: 7,711
Записей в блоге: 3
30.05.2014, 19:15     Прямой доступ к переменным #9
Как сделать 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;
}
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
30.05.2014, 19:59     Прямой доступ к переменным #10
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));
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 284
Регистрация: 04.12.2011
Сообщений: 7,711
Записей в блоге: 3
30.05.2014, 20:11     Прямой доступ к переменным #11
Цитата Сообщение от Psilon Посмотреть сообщение
IGPIGP, я так понял, что в качестве key хочется иметь строку, а в качестве value - число, строку или еще что. то есть а-ля:
Дык, или то или другое.
Я сначала <int, string> выложил, а потом вычитал, что ключом должна быть строка и предложил <string, strng>. С типами <string, int> та же история.
Конечно если ключ - целое, то быстрее будет.
Psilon, если честно мне непонятно как выбирается поле структуры и зачем передавать адрес поля, а не указатель на экземпляр например. Вообще, в простых случаях можно делать по старинке: объявлять перечисление и массив строк. Тогда в коде можно найти строку используя имя константы как индекс (если декорировать объявление уточняющим типом перечисления). То есть может выглядеть Arr_str[one] (значение вроде "first_val" или просто "one", в зависимости от того что в массиве строк положили).
А поиск по индекса по строке, - руками. Но со словарём поддержка методов класса есть. Так, что дело вкуса.
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
30.05.2014, 22:01  [ТС]     Прямой доступ к переменным #12
Psilon, с void пытался. Ругается при компиляции
Код
error: cannot declare pointer to 'void' member
IGPIGP, то есть просто представлять числа в виде строк? Вот тут что-то не понял. Для вывода на экран конечно пойдет, но а если делать арифметические вычисления?
Поле структуры выбирает пользователь. Можно конечно сделать блок условий, как я писал в первом посту, но если полей 10? Писать 10 условий? Вот и задался вопросом выбора поля по введенной строке. Вариант с асоциативным массивом подходит, но тут уже не клеится с другой стороны. Почему передавать поле, а не экземпляр? Потому что нужно именно поле. При каждом вызове пользователь должен определять сам к какому полю обращаться. Хотя может я вообще велосипед делаю... А вот как делать по старинке не сообразил что-то
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
30.05.2014, 23:24     Прямой доступ к переменным #13
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);
такие дела
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
30.05.2014, 23:50  [ТС]     Прямой доступ к переменным #14
Psilon, а на сценарных языках еще проще, но ведь не об этом
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
31.05.2014, 00:57     Прямой доступ к переменным #15
Arkaniy, плюсы и шарп очень похожи, на самом деле. Шарп - это такие плюсы "с человеческим лицом" Поэтому практически уверен, что на них можно сделать подобным образом все (тем более, что типобезопасность в плюсах намного слабее), просто мы о таком способе не знаем

Не по теме:

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



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

Не по теме:

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

IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 284
Регистрация: 04.12.2011
Сообщений: 7,711
Записей в блоге: 3
31.05.2014, 01:31     Прямой доступ к переменным #17
Цитата Сообщение от Arkaniy Посмотреть сообщение
IGPIGP, то есть просто представлять числа в виде строк?
Пара в мапе может быть любой но определенной вначале. Может быть map<string, int> тоже.
А если:
Цитата Сообщение от Cra3y Посмотреть сообщение
Хм.. например использовать boost::variant
то есть:
Цитата Сообщение от Psilon Посмотреть сообщение
Arkaniy, если верить гуглу, можно соорудить что-то вроде такого
C++
1
typedef map<std::string,boost::variant<int, std::string>> str2any
то и то и другое.
Но мне кажется лучше бы задачу увидеть. Расскажите, интересно же.
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
31.05.2014, 01:33     Прямой доступ к переменным #18
IGPIGP,
Хм.. например использовать boost::variant
то есть:
слона-то я и не приметил
В смысле полез в гугл, хотя на предыдущей странице уже ответили)
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
31.05.2014, 01:46  [ТС]     Прямой доступ к переменным #19
IGPIGP, про пару в мапе знаю, но мне же нужно чтобы ключ был стрингом, а значение перенным типом.
Я тот пост заметил, но попытал счастья в обход буста
А задача, собственно, простая.
Придумал себе структуру фильм. Поля такие как режиссер, год, страна и т.д. Как видно, есть и строковые поля, и чиловые. Нужно достать из массива только те фильмы, которые отвечают параметрам запроса пользователя. К примеру, все фильмы 2000 года.
Вот и получается, что нужно смотреть именно по полю год. Вот это поле и нужно передать в ф-цию. С этим разобрались, да поля-то разных типов и не ясно было как в мап засунуть эти значения.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2014, 01:46     Прямой доступ к переменным
Еще ссылки по теме:

C++ "Двойной" доступ к переменным класса
C++ прямой доступ к видеопамяти
Доступ к переменным в DLL программе из внешних програм C++

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

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 284
Регистрация: 04.12.2011
Сообщений: 7,711
Записей в блоге: 3
31.05.2014, 01:46     Прямой доступ к переменным #20
Цитата Сообщение от Psilon Посмотреть сообщение
слона-то я и не приметил
Дык, я сам грешу этим часто.
Понимаешь, не пойму как пользователь поля выбирать будет. Для меня структура, запись, строка таблицы, это квант какой-то общей сущности. Матрица её описания, что ли. То есть у слона есть уши, хобот и хвост. Как тут выберешь. Если украшать его цветами, например, то придётся как-то по очереди. Я бы начал с ушей... А что-то можно и не украшать. Но это логика какой-то внутренней процедуры, - "эки-слоно-бана", например. А пользователю нужно бы разрешить выбирать слона. Большого, маленького или... жирафа. А процедура должна соответствовать выбору. Хотя в жизни всяко бывает. Хочется узнать зачем выбирать поле и передавать его по ссылке.
Yandex
Объявления
31.05.2014, 01:46     Прямой доступ к переменным
Ответ Создать тему
Опции темы

Текущее время: 01:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru