Как я могу получить доступ к переменным в векторе <struct>* obj? - PullRequest
2 голосов
/ 07 марта 2009

Как бы я получил свои переменные из вектора?

Я не могу использовать бинарные операторы вставки или операторы равенства.

Ранее я объявил vector<someStruct> *vObj и выделил его, затем вернул vObj и вызвал его в этой функции:

vector<sameStruct> firstFunc();

for (unsigned int x = 0; x < v->size(); x++)
{
   v[x];
}

когда я отлаживаю, v[x] теперь имеет полное содержимое исходного вектора, как это было раньше без индекса / индекса.

Но я не думаю, что сделал что-то для того, чтобы продвинуться дальше.

У меня просто около 4 переменных внутри моего вектора; когда я отлаживаю его, в нем есть информация, которая мне нужна, но я не могу получить ее.

Ответы [ 2 ]

2 голосов
/ 07 марта 2009

Как написано v - указатель на вектор структур.

Когда вы индексируете непосредственно в v, все, что вы делаете, это арифметика указателя. v [x] - это вектор структур в позиции x (при условии, что v является массивом, если это просто один объект в конце указателя, тогда v [x] для x> 0 - просто мусор) Это потому, что он применяет [x] не к вектору, на который указывает v, а к самому указателю v.

Вам нужно разыменовать указатель и затем индексировать вектор, используя что-то вроде:

(*v)[x];

На данный момент у вас есть ссылка на объект в x-й позиции вектора, чтобы получить его функции / переменные-члены:

(*v)[x].variable;

или

(*v)[x].memberfunction(parameters);

Если вы не хотите разыменовывать вектор, тогда обращайтесь к элементу внутри него, вы можете попробовать что-то вроде:

v->at(x);
v->at(x).variable;
v->at(x).memberfunction;

Таким образом, вы получаете доступ к функции-члену объекта точно так же, как при вызове:

v->size();

Надеюсь, это поможет.

1 голос
/ 07 марта 2009

Чтобы использовать оператор [] для доступа к элементам, вы должны сделать это для объекта, а не указателя на объект.

Постарайтесь;

(*vec)[x];

* 1006 Е.Г. *

for (int i = 0; i < vec->size(); i++)
{
  printf("Value at %d is %d\n", i, (*vec)[i]);
}

Обратите внимание, что при вызове функций для указателя вы обычно используете оператор -> вместо оператора . , но вы можете легко сделать (* vec) .some_func (); вместо этого.

Операторы, такие как [], -, ++ и т. Д., Могут действовать как на объекты, так и на указатели. С объектами они действуют как вызовы функций, но с указателями они действуют как математические операции над адресом.

Например;

pointer[nth];
*(pointer + nth);

Имеют точно такой же эффект - они возвращают n-й объект с начала указателя. (обратите внимание на расположение * во втором примере, оно называется после смещения применяется.

Два других совета;

Вы также можете избежать необходимости разыменования, передавая вектор как ссылку, а не как указатель. Это не всегда подходящий вариант, но он приводит к более чистому коду.

void my_func(std::vector<int>& vector)
{
  // vector can then be used as a regular variable
}

Если вы собираетесь многократно передавать векторы определенного типа в функции, то вы можете использовать typedef как для ясности, так и для экономии при наборе текста.

typedef std::vector<int> IntVector;

void my_func(IntVector& vector)
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...