如何正确初始化vector <int>&amp; vecRef?投掷错误C2758

时间:2015-07-29 15:20:08

标签: c++ vector

我遇到过这种情况,我需要经常传递一个向量。理想的想法是通过引用传递它,这样程序就不会因不断复制向量而减慢速度。

类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;根本没办法解决这个问题?

2 个答案:

答案 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方法)。它会产生相同的效果,但需要更少的多余打字。