初始化类成员对象

C++ initializing a class member object

本文关键字:成员对象 初始化      更新时间:2023-10-16

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

,但你通常需要定义更多的方法,如复制函数,赋值操作符等