2

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

より良い解決策はありますか?

ありがとうございました。

4

3 に答える 3

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}} {}
};
于 2014-09-10T18:08:12.930 に答える
0

次のように、委譲 ctorlambda-functionを使用できます。

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

それでも、C++ で実行でき Java では実行できないすべてのことを利用するように再設計するのが、おそらくより良いアイデアです。

于 2014-09-10T18:06:30.733 に答える