C ++初始化类成员对象

时间:2013-04-06 13:37:56

标签: c++

我是C ++的新手,但有一些Java经验。 我会用Java做到这一点:

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

但是我不知道如何在C ++中做到这一点,我应该保留一个指向DynHashtable的指针,还是应该保留它的Object,或者没有区别?

2 个答案:

答案 0 :(得分:3)

在这种情况下,我猜你不需要保留任何指针。为您的数据成员自动存储持续时间。它将在构造包含它的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) {
    //            ^^^^^^^^^
        // ...
    }
};

答案 1 :(得分: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>>())
    {
    }
};

但您通常需要定义更多方法,例如copy-ctor,赋值运算符等。