我遇到过这种情况,我需要经常传递一个向量。理想的想法是通过引用传递它,这样程序就不会因不断复制向量而减慢速度。
类Bar具有原始向量。
Bar.h:
#ifndef Bar_h
#define Bar_h
#include <iostream>
#include <vector>
using namespace std;
class Bar{
public:
Bar();
vector<int> & getVec();
private:
vector<int> vec;
};
#endif
Bar.cpp:
#include <iostream>
#include "Bar.h"
using namespace std;
Bar::Bar(){
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
}
vector<int> & Bar::getVec(){
return vec;
}
Class foo接收矢量。
foo.h中:
#ifndef Foo_h
#define Foo_h
#include <iostream>
#include <vector>
using namespace std;
class Foo{
public:
Foo();
private:
vector<int> & vecRef;
};
#endif
Foo.cpp中:
#include <iostream>
#include "Foo.h"
#include "Bar.h"
using namespace std;
Foo::Foo(){
Bar bar;
vecRef = bar.getVec();
}
主:
#include <iostream>
#include "Foo.h"
using namespace std;
void main(){
Foo foo();
}
问题是,在编译时,我得到错误代码C2758,其中stats“必须初始化引用类型的成员”。它指的是foo类和vector&lt;'int&gt; &安培; vecRef;没有正确初始化。我的问题是如何在foo.h中保持声明的同时正确初始化vecRef? (我已经通过在foo.cpp中声明vecRef成功完成了它,但如果可能的话,这不是我想要的)。或者正在添加'&amp;'进入矢量&lt;'int&gt; &安培; vecRef;根本没办法解决这个问题?
答案 0 :(得分:0)
必须在此处的成员初始值设定项列表中初始化引用:
Foo::Foo()
: vecRef(???) // <==
{ }
如果一个成员变量没有在那里列出,它将被默认初始化,并且引用不能默认初始化 - 因此错误。此外,您的代码无法编译是件好事,因为否则:
{
Bar bar;
vecRef = bar.getVec();
} // <== bar gets destroyed here
// vecRef is now a dangling reference
您可能想要做的是通过引用将Bar
传递给Foo
的构造函数,然后像这样初始化vecRef
:
Foo::Foo(Bar& bar)
: vecRef(bar.getVec())
{ }
或者直接参考:
Foo::Foo(std::vector<int>& v)
: vecRef(v)
{ }
答案 1 :(得分:0)
引用不能引用任何内容。因此,您必须在构造函数中初始化foo
s vecRef
。实际上这已经在Barrys的回答中详细解释了,我只想指出以下内容:
一旦您提供对成员变量引用的公共访问权限,就没有必要将此成员变量设为私有。您也可以在vec
中公开Bar
(并且不需要getter方法)。它会产生相同的效果,但需要更少的多余打字。