C++ 返回指向std::vector中的对象的指针

C++ 返回指向std::vector中的对象的指针,c++,stdvector,C++,Stdvector,我有一个非常基本的问题,关于返回对向量元素的引用 有一个vectorvec存储类Foo的实例。我想从这个向量中访问一个元素。(不希望使用向量索引)。我应该如何在这里编写方法getFoo #include<vector> #include<stdio.h> #include<iostream> #include<math.h> using namespace std; class Foo { public:

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

有一个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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
类Foo{
公众:
Foo(){};
~Foo(){};
};
B类{
公众:
向量向量机;
Foo*getFoo();
B(){};
~B(){};
};
Foo*B::getFoo(){
int i;
向量推回(Foo());
i=向量大小()-1;
//如何返回指向vec[i]的指针??
返回向量(i);
};
int main(){
B B;
b=b();
int i=0;
对于(i=0;i<5;i++){
b、 getFoo();
}
返回0;
}

为什么要在getFoo()方法中添加新的Foo对象?你不是应该去找回第1个吗

如果是这样,您可以使用

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

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

使用该方法。您可以执行return
&vec.back()

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

Foo& B::getFoo() {
    vec.push_back(Foo());
    return vec.back();
}
请注意,如果发生重新分配,指向
向量的引用、指针和迭代器将失效


同时,将成员数据公开(如此处的
vec
)也不是一个好做法-最好根据需要为类提供访问方法。

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

Foo& B::getFoo(){
  vec.push_back(Foo());
  return vec.back();
};
当然,您还必须更改类B中getFoo()的声明:

class B {
      public:
             vector<Foo> vec;
             Foo& getFoo();
};
B类{
公众:
向量向量机;
Foo&getFoo();
};

谢谢!实际上,当需要创建新的Foo时会调用该方法,并且该方法需要返回对该新Foo的引用。因此,名称可能应该是create_Foo()或类似的名称。另一个问题:假设我返回对vec[I]的引用,然后对vec进行排序。它仍然会返回i处的新元素(vec[i]),还是会继续引用排序前在i处的旧元素?@memC:它仍然会指向向量中的同一元素,但其值可能已更改。@gf:您写道:“将成员数据公开(如此处的vec)不是一个好做法”-->您的意思是将
vec
声明为
private
?如果是这样,当我将
vec
中元素的引用返回到外部类时,它不会给出错误吗?@memC:是的,我的意思是将
vec
设为私有。您仍然可以返回对其内容的引用(甚至是对向量本身的引用,尽管这样做会破坏目的),这只是意味着类的用户不能直接访问成员
vec