5

私は C++ を初めて使用し、最近目的指向プログラミングの研究を始めました。3 次元ベクトルと 3x3 行列を処理する独自の線形代数モジュールを書きたいと思っていました。行列を 3 つのベクトルからなるクラスとして定義しようとしました。

class vector {
  public:
  double n1, n2, n3;
  vector (double a, double b, double c) {
         n1 = a; n2 = b; n3 = c;
         }
  };

class matrix {
  public:
         vector m1, m2, m3;
         matrix (vector a, vector b, vector c) {
                m1 = a; m2 = b; m3 = c;
                }
         };

ただし、コンパイル エラーが発生します。

In constructor `matrix::matrix(vector, vector, vector)':
no matching function for call to `vector::vector()'

プログラムは、定義したベクトルクラスを使用して行列を構築する方法を知らないと推測しています。しかし、私はその理由を理解していません。誰かが説明できれば、私はとても感謝しています。

4

5 に答える 5

6

m1,m2,m3メンバー初期化子リストでメンバーを初期化する必要があります。

matrix (const vector& a, const vector& b, const vector& c)
: m1(a),m2(b),m3(c)

次の点に注意してください。

  • この形式は、コンストラクターでのみ使用できます。
  • 非静的なconstデータ メンバーを初期化するには、(少なくとも C++11 より前のバージョンでは) この形式を使用する必要が あります。
  • 参照データ メンバーを初期化するには、このフォームを使用する必要があります。

また、 があることに注意std::vectorしてください。独自のベクトルの名前を変更して名前の競合をなくしたい場合がありvector、const 参照で渡すことをお勧めします。

于 2013-08-29T11:43:25.227 に答える
4

これがうまくいかない理由は次のとおりです。

オブジェクトの構築は複数のフェーズで行われます。マトリックス クラスの場合、最初にすべてのメンバー オブジェクトを作成してから、コンストラクタ本体を実行する必要があります。ここで理解しておくべき重要なことは、コンストラクター本体に入る前に、すべてのメンバー オブジェクト (この場合m1m2m3) が構築されている必要があるということです。

問題は、コンパイラがvectorそれ自体でメンバーを構築できないことです。コンパイラは 1 つのコンストラクターしか認識しておらず、構築にvector3 つdoubleの s が必要であることを認識していますが、それはありません。vectorbillz の回答で示唆されているように、初期化子リスト構文を使用するために不足しているコンストラクター引数をコンパイラーに提供できます。

これが機能するのは、初期化子リストが、コンストラクター本体フェーズの前に発生する、スタートアップのメンバー構築フェーズ中に実行されるためです。

vectorまたは、 Zacの回答で示唆されているように、コンパイラが追加情報なしでマトリックスメンバーを自動的に構築できるように、デフォルトのコンストラクターを提供します。

于 2013-08-29T12:02:19.487 に答える
1

パラメータを持たないクラス ベクトルのデフォルト コンストラクタが必要です。

class vector {
  public:
  double n1, n2, n3;
  vector () { // <- this one
    n1 = 0; n2 = -1; // sample initializing code
  };
  vector (double a, double b, double c) {
         n1 = a; n2 = b; n3 = c;
         }
  };
于 2013-08-29T11:53:35.073 に答える
0

または、「推奨されるc++ 11」の方法で:

matrix (vector a, vector b, vector c)
: m1(std::move(a)),m2(std::move(b)),m3(std::move(c)) {
}
于 2013-08-29T13:08:26.967 に答える