C ++ Указатели помогают? - PullRequest
0 голосов
/ 03 мая 2011

Мне нужно немного помочь с использованием указателей в C ++.Извините, что вы начинающий, но я действительно не совсем понимаю их.Я прочитал учебник по указателям на веб-сайте cplusplus.com, поэтому, пожалуйста, не предлагайте это.

У меня есть переменная, которая содержит имя другой переменной, и я хочу получить доступ к этой переменной черезДержатель один.Я считаю, что мне нужно использовать указатели, поправьте меня, если я ошибаюсь.

Например

int a;
string b;

a = 10;
b = "a";

Мне нужно получить доступ к переменной "a" через содержимое переменной "b".

Просто для лучшего понимания, вот как я его использую:

int a;
a = 20;

void getVar(string name) {
    cout << name;
}

getVar("a");

Но, как вы можете видеть, в пятой строке это будет просто указывать значениеимя, в данном случае «a», но я хочу, чтобы он указывал значение переменной, содержащейся в имени, поэтому я хочу, чтобы он вывел «20».

Любая помощь здесь будет принята с благодарностью.

Ответы [ 8 ]

4 голосов
/ 03 мая 2011

Если вам нужно связать имя со значением, рассмотрите ассоциативные массивы, иначе известные как словари, и карты . В стандартной библиотеке шаблонов есть std::map, которую можно использовать для связывания текста со значением:

#include <map>
#include <string>

std::map<std::string, int> my_map;

my_map["A"] = 20;

cout << my_map["A"] << endl;
2 голосов
/ 03 мая 2011

То, о чем вы думаете, называется ( Reflection ), которое C ++ не поддерживает. Однако вы можете использовать указатели для доступа к тому, что находится в переменной, на которую она указывает:

int a = 5; //int variable that stores 5
int *b = &a; //int pointer that stores address of a

(*b) = 10; //stores 10 into address that b points to (a)

cout << a; //prints 10
2 голосов
/ 03 мая 2011

То, чего вы пытаетесь достичь, невозможно на скомпилированном языке (не учитывая рефлексию). Вы можете сделать что-то подобное, используя структуру данных карты.

theMap["a"] = 20;

и соответствующий

void getVar(string key){
     cout << theMap[key];
}

, который можно вызвать с помощью

getVar("a");

Обратите внимание, что в этом чрезвычайно простом примере theMap должен находиться в области действия функции, как в классе или пространстве имен.

Если вы используете указатели, вы просто используете уровень косвенности, который совсем не подходит для вашего примера. См. Ответ Чадса, например.

1 голос
/ 03 мая 2011

То, что вы запрашиваете, называется «отражением» или «самоанализом» - возможностью использовать имена времени разработки для объектов вашей программы (классов, переменных, функций и т. Д.) Во время выполнения. C ++ не поддерживает это «из коробки» - имена времени разработки удаляются при компиляции.

Некоторые библиотеки предоставляют такую ​​возможность в C ++; но есть также языки, в которых отражение является частью языка. Python или JavaScript, например.

1 голос
/ 03 мая 2011

Нет реального способа получить доступ к переменным по имени, как этот, если только вы не создадите какой-то контейнерный класс, у которого есть член name, по которому вы ищите. Я не уверен, что это имеет отношение к указателям.

0 голосов
/ 03 мая 2011

Ваш код не использует указатели.вы пытаетесь преобразовать строку в идентификатор и распечатать ее результат, я не знаю, возможно ли это или нет.Если вы намеревались использовать указатель, ваш код должен был выглядеть следующим образом:

int a = 20;
int* b = &a;
cout << *b;
0 голосов
/ 03 мая 2011

Может быть, это может подойти вам:

int a = 5;
class b {
public:
   b(int &x) { ref_ = x; }
   int operator()(void) { return ref_; }
private:
   int &ref_;
}

b my_b(a);
my_b() /* -> 5 */;
0 голосов
/ 03 мая 2011

быстрое исправление только для вывода целых чисел:

int a; а = 20;

void getVar (int name) { кут << имя; } </p>

Getvar (а);

Если вам нужна функция для работы с любым типом переменной, возможно, подумайте о какой-нибудь шаблонной функции.

Редактировать: вот код для шаблона программы:

#include <iostream>
#include <string>

using namespace std;

template <class T>
void getVar(T name){
    cout<<name<<endl;
}

int main()
{
string x="hee";
int y=10;
getVar(x);//outputs hee
getVar(y);//outputs 10
return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...