7

行列を表す 2 つのクラスがあり
ます。1. RegularMatrix - O(n^2) 表現
2. SparseMatrix - リンクされたリスト (ゼロなし) として表される行列。

私が持っているとしましょう:

RegularMatrix a;
SparseMatrix b;

私はできるようになりたい:

a+b;

また:

b+a;

だから私は + 演算子をオーバーロードしています。私の質問は、追加を可換 (a+b = b+a) にしたいので、ケースごとに 1 つずつ、2 つのオーバーロードを実装する必要があるかどうかです。

RegularMatrix operator+(const RegualarMatrix &, const SparseMatrix &);
RegularMatrix operator+(const SparseMatrix & ,const RegualarMatrix &);

または、コンパイラが独自に決定する一般的な形式はありますか?

ありがとうございました

4

3 に答える 3

10

はい、両方のバージョンが必要です。ただし、操作が本当に可換である場合は、一方を他方に転送できます

RegularMatrix operator+(const SparseMatrix &a, const RegualarMatrix &b) {
    return b + a;
}
于 2010-09-21T21:27:50.873 に答える
1

両方のバージョンが必要です。最初のオーバーロードの後に​​書くだけです:

RegularMatrix operator+(const SparseMatrix &a, const RegualarMatrix &b)
{
    return operator+(b,a);
}

またはより単純なバージョン:

RegularMatrix operator+(const SparseMatrix &a, const RegualarMatrix &b)
{
    return b + a;
}
于 2016-01-03T19:24:17.060 に答える