2016-03-08 82 views
0

請原諒我,我的C++有點生疏。對象引用必須在構造函數庫/成員初始值設定項列表中初始化

我試圖通過一個接口創建一個單例(這樣,系統可以很容易地在以後根據需要進行擴展)。

我已經得到了以下接口:

#ifndef IBUILD_CONFIGURATION_H 
#define IBUILD_CONFIGURATION_H 

*IBuildConfiguration.h* 
class IBuildConfiguration 
{ 
    public: 
     virtual int foo(void) = 0; 
}; 

IBuildConfiguration& BCInstance(void); 

#endif /* IBUILD_CONFIGURATION_H */ 

而下面的具體類:

BuildConfiguration.h

#ifndef BUILD_CONFIGURATION_H 
#define BUILD_CONFIGURATION_H 

class BuildConfiguration : public IBuildConfiguration 
{ 
    public: 

     BuildConfiguration(); 
     ~BuildConfiguration(); 

     virtual int foo(void); 
}; 

#endif /* BUILD_CONFIGURATION_H */ 

BuildConfigration.cpp

BuildConfiguration::BuildConfiguration() 
{ 
    // init stuff 
} 

BuildConfiguration::~BuildConfiguration() 
{ 
    // destroy stuff 
} 

int BuildConfiguration::foo(void) 
{ 
    return 382000; //just for fun 
} 

// Singleton initialization function 
IBuildConfiguration& BCInstance(void) 
{ 
    static BuildConfiguration instance = BuildConfiguration(); 
    return instance; 
} 

現在,我試圖使用對象如下:

MyClass.h

#include "IBuildConfiguration.h" 

class MyClass 
{ 
    private: 
     IBuildConfiguration& oFoo; 

    public: 
     MyClass(); 
}; 

MyClass.cpp

MyClass::MyClass() 
{ 
    oFoo = BCInstance(); 
} 

不幸的是,這個結果在編譯器錯誤'oFoo' : must be initialized in constructor base/member initializer list,我無法弄清楚發生了什麼事。由於

回答

2

要添加到什麼人已經表示,將已經創建的類成員(通過其默認的構造函數):只能初始化。因此,類體內的任何初始化都會調用賦值構造函數,因爲該對象已經被創建。

現在,由於無法重新初始化引用,因此在構造函數體內分配引用意味着重新初始化,因此編譯器會標記一個錯誤,要求您在構造函數初始化列表中初始化引用。 初始化const成員和沒有默認構造函數的類的成員時也是如此。

1

按照錯誤信息指示:

MyClass::MyClass() : oFoo(BCInstance()) 
{ 
} 
1

不能修改的參考指的是什麼。當程序進入構造函數體

MyClass::MyClass() : oFoo(BCInstance()) 
{ 
} 
相關問題