2014-09-28 345 views
0

我有麻烦具有一定的参考变量的点,第一关断这是我的类C++引用类型必须被初始化

头文件

#pragma once 
#include "ImageLoader.h" 
#include "FontLoader.h" 

class LevelState 
{ 
public: 
    LevelState() 
private: 
    ImageLoader& _imageLoader; 
    FontLoader& _fontLoader; 
} 

类文件

#include "LevelState.h" 

LevelState::LevelState() 
{ 

} 

现在当我去建立我得到这些错误

Error 2 error C2758: 'LevelState::_fontLoader' : a member of reference type must be initialized 
Error 1 error C2758: 'LevelState::_imageLoader' : a member of reference type must be initialized  

于是我接着说干就干,更新了我的构造方法来在ImageLoader的和FontLoader像这样

LevelState::LevelState(FontLoader& fontLoader, ImageLoader& imageLoader) 
{ 
    _fontLoader = fontLoader; 
    _imageLoader = imageLoader; 
} 

但我仍然得到同样的错误如上,什么错误?我知道我可以改变我对指针的引用,只是给它们指定方式,但我更喜欢使用引用,因为它们更安全。

+1

您必须在构造函数初始化列表中初始化成员引用,而不是在构造函数体中。 – 2014-09-28 20:04:29

回答

3

变化的构造通过以下方式

LevelState::LevelState(FontLoader& fontLoader, ImageLoader& imageLoader) 
    : _fontLoader(fontLoader), _imageLoader(imageLoader) 

{ 
} 

在你的构造

LevelState::LevelState(FontLoader& fontLoader, ImageLoader& imageLoader) 
{ 
    _fontLoader = fontLoader; 
    _imageLoader = imageLoader; 
} 

引用不被初始化。有一些使用赋值语句试图将值分配给引用必须引用的对象。

这个纪录

_fontLoader(fontLoader), _imageLoader(imageLoader) 

被称为MEM-初始化列表。它用于初始化对象(包括常量和引用)

考虑到复制构造函数和复制赋值运算符被隐式定义为由编译器删除。

+0

令人敬畏的,伟大的工程,但是你能解释为什么我需要使用:在方法的结尾? – Canvas 2014-09-28 20:01:01

+0

@Canvas正如我写的,它是为类的数据成员设置初始值设定项的特殊记录。 – 2014-09-28 20:02:13