1

私は非常に長い間 Java を使用してきましたが、C++ プログラミング スタイルに慣れるのに苦労しています。

以下のようなシナリオを管理する方法:

  • インスタンス変数は、デフォルトのコンストラクターを使用して作成できないオブジェクトです。Java コンストラクターでは、より高いレベルのクラス コンストラクターでパラメーターを決定できます。

  • インスタンス変数は参照型であり、コンストラクターで単純なアルゴリズム (条件、計算など) を実行し、オブジェクトを作成してその参照に割り当てる必要があります。

コンストラクターの初期化リスト以外の場所でインスタンス変数を開始する必要がある同様のシナリオがおそらくあります。GCC はそれを許可すると思います (警告を発行します) が、VC++ は許可していないようです。

これらのほとんどはポインターを使用して実行できると思いますが、できる限りポインターを回避しようとしています (実行時のクラッシュを最小限に抑え、問題のデバッグを困難にするため)。

4

1 に答える 1

2
  • インスタンス変数は、デフォルトのコンストラクターを使用して作成できないオブジェクトです。Java コンストラクターでは、より高いレベルのクラス コンストラクターでパラメーターを決定できます。
class A {
public:
  A(int n);
}

class B {
public:
  B(int n) : a1(n), a2(n+1) {}
private:
  A a1, a2;
}
  • インスタンス変数は参照型であり、コンストラクターで単純なアルゴリズム (条件、計算など) を実行し、オブジェクトを作成してその参照に割り当てる必要があります。
static int n = 1;
static int m = 2;
class A {
public:
  A(bool useN) : ref(useN ? n : m) {}
private:
  int &ref;
}

もちろん、(静的) ヘルパー関数でより複雑な計算を非表示にすることができますref(f(parameters))。これは、初期化子リストに含まれています。

最初にオブジェクトを作成してから参照に割り当てる必要がある場合、そのオブジェクトは主にどこに存在しますか? 結局のところ、参照とは、誰かが他の誰かを指差して「あそこにいるのは私です」と言っているだけです。外部オブジェクトが実際にこのオブジェクトを所有している場合、参照は必要ありません。オブジェクトまたはスマート ポインターのいずれかが必要です。

Java 参照は、おそらく C++11 のstd::shared_ptrに最も近いものであり、標準ライブラリのスマート ポインターの 1 つであり、日常的な使用に強く推奨されています。この種の設定では、 も検討する必要がありますstd::uniqe_ptr。これはオーバーヘッドが少し少なくなりますが、制限があります。適切なコピー コンストラクターを作成する必要があるという事実が問題であるかどうかは、好みの問題です。多くの場合、既定のコンストラクターを組み合わせるとshared_ptr、必要な動作が得られません。

後方互換性のためにのみ言語に含まれている には近づかないでstd::auto_ptrください。多くの状況で正しく使用するのは難しいです。

于 2012-05-21T06:18:03.197 に答える