2012-07-06 49 views
0

我有一個配置類,我想傳遞給另一個類(稱爲使用)在構造函數中。我想將配置類作爲私有成員變量存儲在Use類中。我希望它是const。如何傳遞一個const對象

到目前爲止,我有這樣的代碼:

class Configuration{ 
private: 
    int value1_; 
public: 
    Configuration(); 
    Configuration(int value1){value1_=value1;} 
    int value1() const { 
     return value1_; 
    } 
}; 

class Use{ 
private: 
    //const me 
    Configuration config_; 
    int something_; 
public: 
    Use(Configuration &config){ 
     config_=config; 
    } 

    void doSomething(){ 
     something_+=config_.value1(); 
    } 
}; 

我想爲const Use::config_,但每當我試圖在混亂的編譯錯誤結束的方式。我該怎麼做?

+0

什麼編譯錯誤? – 2012-07-06 17:23:59

回答

2

來支持這一點,最好的方法是使用一個引用,需要有一個更清楚一點的問題是

class Use{ 
private: 
    const Configuration& config_; 
    int something_; 
public: 
    Use(const Configuration &config) : 
     config_(config), 
     something_(0) { 

    } 

    void doSomething(){ 
     something_+=config_.value1(); 
    } 
}; 

一個項目ConfigurationUse實例之間的關係。如果有一個Configuration意味着在所有Use實例中共享,那麼參考(如我所概述的)是最合適的選擇。在這種情況下,儘管您需要確保Configuration超過所有參考它的Use實例。

在另一方面,如果Configuration,就是要每Use實例之一,那麼非參考解決方案可能是比較合適的

+1

拍攝一份副本會更安全,除非您可以保證參考文獻在施工後仍然有效。 – 2012-07-06 17:26:20

+1

@MikeSeymour它取決於方案,肯定有副本不正確的情況。是的,用戶應該在這裏澄清,雖然 – JaredPar 2012-07-06 17:27:33

+0

@JaredPar,副本總是適當的,而參考通常不會。可以指出它是一種替代方法,但你確實需要說明這些注意事項。 – 2012-07-06 17:29:09

3

由於成員是const,所以您的構造函數不能分配給它。但是,它可以從它的初始化器列表直接初始化它:

Use(Configuration const & config) : config_(config) {} 
0

你應該使用初始化在構造函數的值賦給利弊成員

Use(Configuration &config) 
: config_(config) 
{ 
    ... 
} 
+0

@MikeSeymour對不起,這是一個打字錯誤:) – Mohammad 2012-07-06 17:28:19

0

如果config正在宣佈爲您的班級的const成員,那麼您將無法在創建後對其進行修改。這包括除成員初始化列表之外的任何嘗試爲其分配值的嘗試。此外,當您嘗試調用它的任何非成員函數const時,您將收到編譯器錯誤。由於您還沒有發佈顯式錯誤,我在這裏猜測這可能是您的示例代碼在其實例上調用該類的成員函數時所擁有的。

0

不能分配給const,但你可以在基體初始化列表初始化:

class Use{ 
private: 
    const Configuration config_; 
public: 
    Use(const Configuration & config) 
     : config_(config) 
    { 
    } 
}; 
相關問題