3

それで、単純な座標系の長い休憩の後、今日 C++ を書きました。「座標 c = 新しい座標 (1,2);」のようなものを記述できるように、コンストラクターに 2 つの値を取り込ませたいと考えました。

struct Coordinates {
   int x;
   int y;

   Coordinates(int a, int b) {
      x = a;
      y = b;
   }
};

Cygwin でコンパイルすると、次のようになります。

$ g++ -o adventure adventure.cpp adventure.cpp:36: エラー: `Coordinates::Coordinates()' の呼び出しに一致する関数がありません Adventure.cpp:22: 注: 候補は: Coordinates::Coordinates(const Coordinates&) adventure .cpp:26: 注意: 座標::座標(int, int)

ここで何が問題なのかわからず、C++ 構造体コンストラクターに関する多くの情報が見つかりません。何か案は?

4

2 に答える 2

8

コードの36行目(表示していません)では、このクラスのオブジェクトを作成していますが、コンストラクターに引数を渡していません。有効なコンストラクターは、2つのintを使用するコンストラクター、またはデフォルトのコピーコンストラクターのみです。引数なしでコンストラクターを追加するか、コンストラクターに渡すコードを変更しaますb

于 2012-05-21T23:59:53.313 に答える
4

明示的なコンストラクターを作成することにより、デフォルトのコンストラクターの自動作成を無効にしました。これは、のように、コンストラクターパラメーターなしでオブジェクトを定義するときに使用されますCoordinates coords;。次のように明示的に指定する必要があります。

struct Coordinates {
  int x;
  int y;

  Coordinates(int a, int b) {
    x = a;
    y = b;
  }

  Coordinates(): x(0), y(0) {}
};

デフォルトのコンストラクターでメンバー変数を初期化したことに注意してください。必須ではありませんが、コンパイラによって生成された構造でデフォルトで初期化される状況でも未定義になるため、これは良い考えです。

: x(0), y(0)また、コンストラクター本体の割り当てではなく、メンバー初期化子(パーツ)を使用したことにも注意してください。これは良いスタイルです。クラスオブジェクトの場合、一般的にパフォーマンスが向上し、場合によっては、メンバーを初期化する唯一の方法です(たとえば、メンバーがconst型であるか、デフォルトのコンストラクターがない場合)。

C ++ 11では、次のように記述するだけで、他のコンストラクターがない場合と同じデフォルトのコンストラクターを生成するようにコンパイラーに指示できます。

Coordinates() = default;

クラス定義で。

于 2012-05-22T00:02:44.547 に答える