关于返回对向量元素的引用,我有一个非常基本的问题。
有一个向量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;
}
答案 0 :(得分:2)
为什么要在getFoo()方法中添加新的Foo对象?你不应该只是找回我的那个吗?
如果是这样,您可以使用类似
的内容Foo *getFoo(int i) {
return &vec[i]; // or .at(i)
}
如果您想要向量中的最后一个元素,请使用back()
方法。
答案 1 :(得分:2)
为什么在返回引用时可以使用指针?
Foo& B::getFoo() {
vec.push_back(Foo());
return vec.back();
}
请注意,如果重新分配,vector
内容的引用,指针和迭代器将失效。
同时公开会员数据(例如您的vec
)不是一个好习惯 - 最好根据需要为您的班级提供访问方法。
答案 2 :(得分:1)
使用back方法。您可以返回&vec.back();
答案 3 :(得分:1)
我建议使用引用而不是指针。喜欢这个
Foo& B::getFoo(){
vec.push_back(Foo());
return vec.back();
};
当然,您还必须在B类中更改getFoo()的声明:
class B {
public:
vector<Foo> vec;
Foo& getFoo();
};