2013-04-06 2 views
0

Я новичок в C++, но имею некоторый опыт работы на Java. Я хотел бы сделать это в Java:C++ инициализация объекта-члена класса

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

Но я не знаю, как я могу сделать это в C++, я должен хранить указатель на DynHashtable или я должен держать объект его, или нет никакой разницы ??

+0

Что такое ' DynHashtable'? – 0x499602D2

+0

Всё зависит от меня. Если у вас есть указатель на экземпляр класса, вы можете контролировать его срок службы. Если у вас есть экземпляр класса как член другого класса, тогда время жизни этого экземпляра совпадает с временем жизни инкапсулирующего класса. –

ответ

3

В этом случае, я думаю, вам не нужно держать указатель. Дайте члену данных время автоматического хранения. Он будет построен, когда объект SymbolTable, который его содержит, сконструирован и разрушен, когда объект SymbolTable разрушен.

Иными словами, SymbolTable полностью инкапсулирует и владеет объектом DynHashtable<string>, который несет исключительную ответственность за контроль над его сроком службы.

Кроме того, в C++ вы должны использовать std::string для представления строк (вы должны включить стандартный заголовок <string> импортировать его определение:

#include <string> 

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

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

UPDATE:

Из комментариев, кажется, что DynHastable не является конструктивным по умолчанию, и его конструктор принимает в качестве параметра int. В этом случае вы должны построить свой объект в списке инициализации конструктора:

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

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

спасибо за ответ, но это не сработает. Возможно потому, что у меня есть только такой конструктор: DynHashtable (int); – nomnom

+0

@nomnom: Что значит «не работает»? Ошибка компилятора? Если да, то что такое сообщение? Ошибка выполнения? Если да, то какова линия, где это происходит? –

+1

@nomnom: ОК, если конструктор 'DynHastable' принимает' int', тогда вы должны его построить в списке инициализации конструктора - я покажу это в одно мгновение. Однако обратите внимание, что в вашем вопросе вы делаете: 'hst = new DynHashtable ();' (никакой аргумент, переданный конструктору) –

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>>()) 
    { 
    } 
}; 

но обычно нужно определить несколько методов, как копировальный-CTOR, операторы присваивания и т.д.

Смежные вопросы