Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
#1

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

29.05.2014, 23:32. Просмотров 940. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2014, 23:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Прямой доступ к переменным (C++):

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

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

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

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

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

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

30
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
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/
но это упрощение не отменяет, а упрощает определение типа (несколько затрудняя работу компилятора)).
0
Max Dark
шКодер самоучка
1851 / 1651 / 603
Регистрация: 09.10.2013
Сообщений: 3,678
Записей в блоге: 6
Завершенные тесты: 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]);
2
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
30.05.2014, 03:44 #4
Cra3y, да похоже Вы правы. Но если в PHP можно заселить переменную именем переменной:
PHP
1
2
3
4
$b = 'a';//литерал 'а' может быть просто строка, но как видно далее используется 
//для доступа к переменной с именем a (нетипизированным на момент появления) 
$a = 2;//неявно типизированная переменная, живёт самостоятельно
$$b = 3;//добрались до a и присвоили 3
то в плюсах этого нет. Статическая типизация не позволяет. Или я опять не вруб?

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

Добавлено через 56 минут
И еще возник вопрос. Как сделать map для пар string - int, string - string? Тоесть так, чтобы значения могли быть разных типов. Вообще если так возможно. Нашел тут темку с этим вопросом, но ответ был исчерпывающим и отрицательным. Но тема 2009 года и может есть что-то из 11 стандарта.
0
Max Dark
шКодер самоучка
1851 / 1651 / 603
Регистрация: 09.10.2013
Сообщений: 3,678
Записей в блоге: 6
Завершенные тесты: 2
30.05.2014, 18:08 #7
Хм.. например использовать boost::variant
1
Psilon
Master of Orion
Эксперт .NET
5909 / 4806 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 5
Завершенные тесты: 4
30.05.2014, 18:13 #8
Arkaniy, если бы как в том же .Net все классы реализовывали бы object, то можно было бы сделать map на object, но в плюсах - хз. Мб может получиться извратиться в void* указателями, но тут уже хз
0
Миниатюры
Прямой доступ к переменным  
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
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;
}
0
Psilon
Master of Orion
Эксперт .NET
5909 / 4806 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 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));
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
30.05.2014, 20:11 #11
Цитата Сообщение от Psilon Посмотреть сообщение
IGPIGP, я так понял, что в качестве key хочется иметь строку, а в качестве value - число, строку или еще что. то есть а-ля:
Дык, или то или другое.
Я сначала <int, string> выложил, а потом вычитал, что ключом должна быть строка и предложил <string, strng>. С типами <string, int> та же история.
Конечно если ключ - целое, то быстрее будет.
Psilon, если честно мне непонятно как выбирается поле структуры и зачем передавать адрес поля, а не указатель на экземпляр например. Вообще, в простых случаях можно делать по старинке: объявлять перечисление и массив строк. Тогда в коде можно найти строку используя имя константы как индекс (если декорировать объявление уточняющим типом перечисления). То есть может выглядеть Arr_str[one] (значение вроде "first_val" или просто "one", в зависимости от того что в массиве строк положили).
А поиск по индекса по строке, - руками. Но со словарём поддержка методов класса есть. Так, что дело вкуса.
0
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
30.05.2014, 22:01  [ТС] #12
Psilon, с void пытался. Ругается при компиляции
Код
error: cannot declare pointer to 'void' member
IGPIGP, то есть просто представлять числа в виде строк? Вот тут что-то не понял. Для вывода на экран конечно пойдет, но а если делать арифметические вычисления?
Поле структуры выбирает пользователь. Можно конечно сделать блок условий, как я писал в первом посту, но если полей 10? Писать 10 условий? Вот и задался вопросом выбора поля по введенной строке. Вариант с асоциативным массивом подходит, но тут уже не клеится с другой стороны. Почему передавать поле, а не экземпляр? Потому что нужно именно поле. При каждом вызове пользователь должен определять сам к какому полю обращаться. Хотя может я вообще велосипед делаю... А вот как делать по старинке не сообразил что-то
0
Psilon
Master of Orion
Эксперт .NET
5909 / 4806 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 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);
такие дела
0
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
30.05.2014, 23:50  [ТС] #14
Psilon, а на сценарных языках еще проще, но ведь не об этом
0
Psilon
Master of Orion
Эксперт .NET
5909 / 4806 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 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
2
31.05.2014, 00:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2014, 00:57
Привет! Вот еще темы с ответами:

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

"Двойной" доступ к переменным класса - C++
Господа, прошу совета в изложенной ниже ситуации. Часто мне встречается в различных вариациях, поэтому есть потребность в изящном решении....

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени? - C++
На самом деле ничё фантастического я не прошу, ведь: template &lt;class T&gt; class matrix { friend class diagonal; ...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru