初始化构造函数中的const字段

时间:2014-09-10 17:51:15

标签: c++ constructor const ctor-initializer

C ++中的const字段必须在初始化列表中初始化,这使得从构造函数参数计算相互依赖的值变得非常简单。

将这段java代码翻译成c ++的最佳方法是什么?

public class SomeObject {
  private final String some_string;
  private final int some_int;

  public SomeObject(final String input_filename){
    SomeReader reader(input_filename);

    some_string = reader.getString();
    some_int = reader.getInt();

    reader.close();
  }
}

我想过在SomeObject中封装一个子对象,但这只是改变了问题;或者使用静态方法构造对象:

class SomeObject {
  private:
    const std::string some_string;
    const int some_int;

  public:
    static SomeObject unserialize(const char * input_filename){
      SomeReader reader = new SomeReader(input_filename);

      string str = reader.get_string();
      int i = reader.get_int();

      reader.close();

      SomeObject obj(str, i);
      return obj;
    };

    SomeObject(const std::string str, const int i) :
      some_string(str),
      some_int(i)
    {};
}

有更好的解决方案吗?

谢谢。

3 个答案:

答案 0 :(得分:3)

这是C ++ 11构造函数委派的一个很棒的应用程序:

class SomeObject {
  private:
    const std::string some_string;
    const int some_int;

  public:
    // The "real" constructor for SomeObject
    SomeObject(std::string str, const int i) :
      some_string{std::move(str)},
      some_int{i}
    {}

    // Deserialize from SomeReader (delegates to the primary constructor)
    SomeObject(SomeReader& reader) :
      SomeObject{reader.get_string(), reader.get_int()} {}

    // Deserialize from SomeReader (accepts rvalues,
    //   delegates to the lvalue constructor)
    SomeObject(SomeReader&& reader) :
      SomeObject{reader} {}

    // Deserialize from named file (delegates to the SomeReader&& constructor)
    SomeObject(const char* input_filename) :
      SomeObject{SomeReader{input_filename}} {}
};

答案 1 :(得分:0)

我认为你有正确的方法。

我会建议一些小的改动。

这不正确C ++。

  SomeReader reader = new SomeReader(input_filename);

也许你的意思是:

  SomeReader reader(input_filename);

您可以更改行:

  SomeObject obj(str, i);
  return obj;

  return SomeObject(str, i);

答案 2 :(得分:0)

您可以使用委派代理 lambda-function ,如下所示:

SomeObject(const char* filename) : SomeObject([&]{
    /* Do calculations here */
    return std::make_tuple(...);
}()) {}
SomeObject(std::tuple<...>&& x) : /* ... */ {}

但是,一个更好的想法可能是重新设计,以利用你在C ++中可以做的所有事情,而不能用Java做。