возвращает указатель на объект внутри std :: vector - PullRequest
4 голосов
/ 26 апреля 2010

У меня очень простой вопрос о возврате ссылки на элемент вектора.

Существует вектор vec, в котором хранятся экземпляры класса Foo. Я хочу получить доступ к элементу из этого вектора. (не хочу использовать векторный индекс). Как мне кодировать метод getFoo здесь?

#include<vector>
#include<stdio.h>
#include<iostream>
#include<math.h>

using namespace std;
class Foo {      
      public:
             Foo(){};
             ~Foo(){};
};


class B {
      public:
             vector<Foo> vec;
             Foo* getFoo();
             B(){};
             ~B(){};
};


Foo* B::getFoo(){
int i;
vec.push_back(Foo());
i = vec.size() - 1;

// how to return a pointer to vec[i] ??

return vec.at(i);

};

int main(){
    B b;
    b = B();
    int i  = 0;
    for (i = 0; i < 5; i ++){
        b.getFoo();   
        }

    return 0;
}

Ответы [ 4 ]

2 голосов
/ 26 апреля 2010

Зачем вообще использовать указатели, когда можно вернуть ссылку?

Foo& B::getFoo() {
    vec.push_back(Foo());
    return vec.back();
}

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

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

2 голосов
/ 26 апреля 2010

Почему вы добавляете новый объект Foo в свой метод getFoo ()? Разве вы не должны просто забрать я?

Если это так, вы можете использовать что-то вроде

Foo *getFoo(int i) {
  return &vec[i];  // or .at(i)
}

Если вы хотите последний элемент в векторе, используйте метод back().

1 голос
/ 26 апреля 2010

Я бы предложил использовать ссылки вместо указателей. Как это

Foo& B::getFoo(){
  vec.push_back(Foo());
  return vec.back();
};

Конечно, вам также придется изменить объявление для getFoo () в вашем классе B:

class B {
      public:
             vector<Foo> vec;
             Foo& getFoo();
};
1 голос
/ 26 апреля 2010

Используйте метод back . Вы можете сделать возврат &vec.back();

...