2013-04-06 204 views
0

我是C++新手,但在Java中有一些經驗。 我會做到這一點在Java中:C++初始化類成員對象

public Class SymbolTable{ 
    private DynHashtable<String> hst; 
    public SymbolTable(){ 
     hst = new DynHashtable<String>(); 
    } 
} 

但我不知道我該怎麼做,在C++中,我應該保持一個指針DynHashtable或者我應該保持它的一個對象,或者是沒有區別的??

+0

什麼是' DynHashtable'? – 0x499602D2 2013-04-06 13:38:45

+0

這取決於。如果你有一個指向類實例的指針,你可以控制它的生命週期。如果您將該類的實例作爲另一個類的成員,那麼該實例的生命週期與封裝類的生命週期相同。 – 2013-04-06 13:39:45

回答

3

在這種情況下,我猜你不需要保留任何指針。給你的數據成員自動存儲時間。當包含它的對象SymbolTable被構造時,它將被構造,並且當SymbolTable對象被銷燬時被破壞。

換句話說,SymbolTable完全封裝並擁有DynHashtable<string>對象,具有控制其生命週期的專有責任。

此外,在C++中,你應該使用std::string爲代表的字符串(必須包括<string>標準頭導入它的定義:

#include <string> 

class SymbolTable { 
private: 
    DynHashtable<std::string> hst; 

public: 
    SymbolTable() { 
     // ... 
    } 
}; 

UPDATE:

從評論,似乎DynHastable不是default-constructible,其構造函數接受一個int作爲它的參數。在這種情況下,您必須在構造函數的初始化列表中構造您的對象:

class SymbolTable { 
private: 
    DynHashtable<std::string> hst; 

public: 
    SymbolTable() : hst(42) { 
    //   ^^^^^^^^^ 
     // ... 
    } 
}; 
+0

感謝您的回覆,但這不起作用。也許因爲我只有這樣的構造函數:DynHashtable (int); – nomnom 2013-04-06 13:58:18

+0

@nomnom:「不起作用」是什麼意思?編譯器錯誤?如果是這樣,那麼信息是什麼?運行時錯誤?如果是這樣,它發生的路線是什麼? – 2013-04-06 13:59:18

+1

@nomnom:好的,如果'DynHastable'的構造函數接受一個'int',那麼你必須在構造函數的初始化列表中構造它 - 我將在一會兒顯示它。但是,請注意,在你的問題你正在做:'hst = new DynHashtable ();'(沒有參數傳遞給構造函數) – 2013-04-06 14:00:27

1

在C++中,您通常直接爲變量語義嵌入變量,或者使用std::shared_ptr作爲引用語義。這裏的價值語義:

#include <string> 
#include <unordered_set> // the equivalent of DynHashtable AFAICT 

class SymbolTable 
{ 
private: 
    std::unordered_set<std::string> hst; 
public: 
    SymbolTable() // automatically calls the default ctor for hst 
    { 
    } 
}; 

,並在這裏參考的語義:

#include <string> 
#include <unordered_set> // the equivalent of DynHashtable AFAICT 
#include <memory>  // for std::shared_ptr/std::make_shared 

class SymbolTable 
{ 
private: 
    std::shared_ptr<std::unordered_set<std::string>> hst; 
public: 
    SymbolTable() 
     : hst(std::make_shared<std::unordered_set<std::string>>()) 
    { 
    } 
}; 

但您通常需要定義更多的方法,如一個拷貝構造函數,賦值運算符等