4

关于返回对 vector 元素的引用,我有一个非常基本的问题。

有一个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

4 回答 4

2

为什么要在 getFoo() 方法中添加一个新的 Foo 对象?你不应该只是检索第 i 个吗?

如果是这样,您可以使用类似的东西

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

如果您想要向量中的最后一个元素,请使用该back()方法。

于 2010-04-26T04:35:42.390 回答
2

当您可以返回引用时,为什么还要使用指针?

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

请注意,vector如果发生重新分配,对 s 内容的引用、指针和迭代器将失效。

公开成员数据(如您的vec此处)也不是好的做法 - 最好根据需要为您的班级提供访问方法。

于 2010-04-26T04:45:04.060 回答
1

使用后面的方法。你可以退货&vec.back();

于 2010-04-26T04:36:53.980 回答
1

我建议使用引用而不是指针。像这样

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

当然,您还必须更改 B 类中 getFoo() 的声明:

class B {
      public:
             vector<Foo> vec;
             Foo& getFoo();
};
于 2010-04-26T04:49:33.477 回答