初始化类成员对象
C++ initializing a class member object
我是c++新手,但对Java有一些经验。我会在Java中这样做:
public Class SymbolTable{
private DynHashtable<String> hst;
public SymbolTable(){
hst = new DynHashtable<String>();
}
}
但我不知道如何在c++中做到这一点,我应该保持一个指向dynashtable的指针,还是应该保持一个对象,或者没有区别?
在这种情况下,我想你不需要保留任何指针。给数据成员设置自动存储时间。当包含它的SymbolTable
对象被构造时,它将被构造;当SymbolTable
对象被构造时,它将被销毁。
也就是说,SymbolTable
完全封装并拥有DynHashtable<string>
对象,独占控制其生命周期。
同样,在c++中你应该使用std::string
来表示字符串(你必须包含<string>
标准头文件来导入它的定义:
#include <string>
class SymbolTable {
private:
DynHashtable<std::string> hst;
public:
SymbolTable() {
// ...
}
};
更新:
从注释来看,DynHastable
似乎不是默认可构造的,它的构造函数接受int
作为其参数。在这种情况下,必须在构造函数的初始化列表中构造对象:
class SymbolTable {
private:
DynHashtable<std::string> hst;
public:
SymbolTable() : hst(42) {
// ^^^^^^^^^
// ...
}
};
在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>>())
{
}
};
,但你通常需要定义更多的方法,如复制函数,赋值操作符等
相关文章:
- g++ 在某个类成员未初始化时不发出警告
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 对象初始化中是否允许指向此成员的指针?
- 对象初始化后在C++中显示 char 数组时的异常行为
- 为什么两种不同的对象初始化方式给出不同的输出
- 静态 constexpr 成员变量初始化
- C++内联数组成员统一初始化
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- afxmem.cpp中的对象初始化差异
- 删除通过取消引用新对象初始化的对象
- 如何使用sregex_token_iterator对象初始化向量
- 关于默认构造函数,对象初始化/使用C++ OOP
- 内联初始化的静态 const 类成员的初始化顺序保证
- 初始化与类类型相同的静态成员(静态初始化顺序问题)
- C++ 基元类型初始化与对象初始化
- 是否可以在不修改父类的情况下将成员变量初始化推迟到继承的类?
- 哪个函数负责C++全局范围内的类对象初始化?
- 使用从另一个类继承的类的对象初始化成员对象
- 构造函数和对象的成员变量初始化
- 静态成员对象初始化