1

私はこのオペレーターを持っています

Mtx Mtx::operator*(const Vtr &rhs) const
{
Mtx Q(nrows, ncols, 0);

for (int i = 0; i < nrows; ++i) {
    for (int j = 0; j < ncols; ++j) {
        Q.ets[i][j] = 0.0;

        for (int k = 0; k < rhs.length; ++k) {
            Q.ets[i][j] += ets[i][k] * rhs.ets[k];
        }
    }
  }
return Q;
}

この演算子を で呼び出します。3 番目のループでは と がクラス のプライベート メンバーであるため、M3 = M1 * V1コンパイラ エラーが発生します。どうすればアクセスできますか? lengthets[k]Vtr

4

3 に答える 3

4

Mtxたとえば、データの友達を作るかVtr、データの公開評価を提供します

class Vtx {
 public:
  const SomeType& operator[](unsigned int i) const { return ets[i]; }

};

演算子はさまざまな方法で実装できるため、これにより、実際にはデータアクセスが基盤となる実装から切り離されます。

一方、基になる表現への直接アクセスを提供するため、特定のインデックスと特定の要素の間のマッピングを変更する方法で実装を変更できないという制約が追加されます。

于 2012-07-27T05:22:17.873 に答える
4

Mtxの友達になりましょうVtr

 class Vtr {
     friend class Mtx;
     //...
 };

または、Mtx::operator*メソッドを友達にしましょう。

 class Vtr {
     friend Mtx Mtx::operator*(const Vtr &) const;
     //...
 };

これらの変更のいずれかにより、現在の実装をさらに変更することなく機能させることができます。

于 2012-07-27T05:17:52.027 に答える
2

友達があなたの答えです!

クラスを友達にするか、関数にすることができます。

しかし、それがあなたの場合の正しい論理であるかどうかはわかりません。

ほとんどの場合、変数にアクセスできない場合は、アクセスしてはいけません。

アクセス指定子を正しく使用しているかどうかを確認してください。そして、移動する唯一の方法は、friendを使用してから、「friend」関数またはクラスを使用することです。

于 2012-07-27T05:18:57.820 に答える