2012-07-20 61 views
3

我有一個類,並且想要創建一個const int變量,但該變量的值在類的構造函數中不可用。可以在一個方法而不是構造函數中初始化類的const成員變量嗎?

在類的初始化方法中,我獲取值。我可以用這種方法分配嗎? 因爲我只給它分配一次(正如const所說)爲什麼它不起作用?

代碼爲如下[只是個雛形]:

文件:A.H

Class A 
{ 
    private : 
    const long int iConstValue; 

    public : 
    A(); 
    initClassA(); 
} 

文件:A.cpp

A::A() 
{ 
//CanNot initialize iConstValue (Don't have it) 
} 

A::initClassA(some params) 
{ 
// calculation according to params for iConstValue 
iConstValue = (some value) 
} 

這是行不通的。有人有任何解決方案?

注:不能以任何方式對iconstValue獲得價值構造因爲有一些限制。所以請不要這樣做。

+2

「我只給它分配一次(如const所說)」 - const並沒有說你可以分配一次。 const說你根本不能指定它(但你可以初始化它)。賦值和初始化是不同的事情,你嘗試的是賦值。 – 2012-07-20 08:32:50

+2

爲什麼你的類需要'iConstValue'是'const'?也許你的設計需要重新評估? – Aesthete 2012-07-20 08:39:09

+3

當時的課程設計有缺陷。你*應該*能夠在構造函數中獲得值,否則你的對象沒有被正確初始化,並且初始化是構造函數的工作。 – 2012-07-20 08:40:37

回答

10

一個小例子:

class A 
{ 
public: 
    A():a(initial_value_of_a()) {} 

private: 
    const int a; 
    int initial_value_of_a() { return 5; /* some computation here */ }; 
}; 
4

你不能這樣做,因爲你不能改變const變量的值。到initClassA運行時,const數據成員已經被初始化(在這種情況下爲一些垃圾值)。所以你只能在構造函數初始化列表中真正地將數據成員初始化爲某個值。

如果你想只設置一次變量,那麼你可以使非const,並添加一個守衛,所以它只能被設置一次。這是不漂亮,但它會工作:

class A 
{ 
    private : 
    long int iValue; 
    bool isInitialised; 

    public : 
    A() : iValue(0), isInitialized(false); 
    bool initClassA() { 
    if (isInitialized) return false; 
    iValue = something: 
    isInitialized = true; 
    return true; 
    } 
} 

但它不是很好的做法,可以初始化或不是對象。對象在構建時應處於連貫狀態,客戶端不必檢查這些對象是否已初始化。

+0

那麼有什麼替代呢,我想要一個類中的long int,一旦賦值,就不應該改變它。 – EngineeredBrain 2012-07-20 08:36:40

+0

@AnwarShaikh另一種方法是隻給予變量的const訪問權限。 – juanchopanza 2012-07-20 08:38:31

+1

我會建議拋出一個異常,如果init函數被調用兩次,可能從std :: logic_error派生。如果程序確實損壞了。 – 2012-07-20 09:08:40

5

const並不意味着你只能爲它分配一次,就可以永遠分配給一個const對象。一個const變量被初始化一次,其值不能改變。所以你在構造函數中初始化它,當所有的成員和基礎都被初始化時,那麼在那之後你不能再改變它。

如果你不能獲得構造的價值,你可以使變量非const,所以你修改它,或者你可以延遲建設,直到你有所有的數據,使用佔位符,直到你構建真正的目的。

兩階段構造是一種代碼異味,它肯定與const成員不兼容。

+0

在我的場景中,類有一個孩子,必須在其構造上實例化類對象。但是,孩子有一個原始數據(需要處理以獲取const值)那麼我該如何推遲父類的實例化。 – EngineeredBrain 2012-07-20 08:42:27

+1

我不明白那條評論。什麼類的對象?什麼原始數據?你能否改變你的問題來清楚你的意思?你需要改變你的設計,爲什麼不能成爲非const? – 2012-07-20 09:02:44

0

也許你可以做什麼,是一個INT指針的變化,收到此指針在構造函數,並更改您要指針:P

但將不會是相同的功能性,因爲它將是指針,這是常量,不再是價值:/

0

我想我需要改變設計,我應該計算(或獲取)const變量值在構造函數怎麼樣。因爲我以後無法設置它的價值。

+1

請不要添加「謝謝」作爲答案。相反,投票答案,你覺得有幫助。 – Constantin 2014-04-02 07:53:12

相關問題