3

2つの異なる抽象クラスから、戻り型のみが異なる同じ名前の演算子を継承することは可能ですか。もしそうなら、彼ら:

  • 演算子を実装するための構文は何ですか

  • 演算子を使用/解決するための構文は何ですか

  • 他の仮想関数の場合と同じように、一般的な場合のオーバーヘッドはどのくらいですか?

役立つリファレンスまたはサンプルコードを提供していただければ

ありがとう

12struct abstract_matrix {
 13仮想double&operator()(int i、int j);
 14};
 15
 16 struct abstract_block_matrix {
 17仮想double*operator()(int i、int j);
 18};
 19
 20struct block_matrix:abstract_matrix、abstract_block_matrix {
 21
 22};

ブロック行列は、両方の演算子の実装を提供する必要があるため、コンテキストに応じて、行列またはブロック行列のいずれかになります。block_matrixクラスに固有の実装を提供する方法がわかりません。今のところ、これは最後の引数としてオブジェクトラップ型を渡すことによって行われますが、それはあまりきれいではないようです。純粋な行列表記を保持したいと思います。

4

3 に答える 3

1

リターンタイプをオーバーロードすることはできません。関数または演算子が呼び出されると、コンパイラはどちらを呼び出すかを知る必要があります。function(operator)呼び出しが割り当てられたものに基づいてそれを推測することはありません。

あなたはいくつかの行列数学を実装しようとしているようです。おそらく、DirectX SDKまたはOpenGLをダウンロードして、それらがどのように実行されるかを確認すると、適切に実行する方法についていくつかのアイデアが得られる可能性があります。

于 2010-01-01T23:32:14.117 に答える
1

関数の戻り型はそのシグネチャの一部ではないため、block_matrixに2つのoperator +(i、j)を含めることはできません。これはあいまいな呼び出しになります。したがって、多重継承は、この点でここでは一種の赤いニシンです。あなたはそれをすることはできません。

あなたは本当に何をしようとしているのですか、そしてその理由は何ですか?

いずれにせよ、他の質問については、仮想オペレーターは、パフォーマンスとその動作方法の点で仮想関数とまったく同じです。それらの使用方法にはわずかな意味上の違いがありますが、内部的には他の機能と同じように機能します。

于 2010-01-01T23:32:33.673 に答える
0

私はそれを動かしました、しかしそれは不安定です。私はテンプレートが大好きです。

template<class T>
class Base1
{
};

template<class T>
class Base2
{
};

class Derived;
template<>
class Base1<Derived>
{
public:
     double foo(){return 0.1;}
};

template<>
class Base2<Derived>
{
public:
    int foo(){return 1;}
};

class Derived
    : public Base1<Derived>
    , public Base2<Derived>
{
public:
    using Base1<Derived>::foo;
};

int main()
{
     double sum = 0;
     Derived d;
     sum += d.foo(); //+ .1
     Base1<Derived> * pI = &d;
     sum += pI->foo(); //+ .1

     Base2<Derived> * pF = &d;
     sum += pF->foo(); //+ 1

     return (sum*10);
}

テンプレートがないと動作しませんでしたが、動作するはずです。テンプレート化されたメンバー関数を同じ方法で実行するだけで解決できるかどうかはわかりませんが、私の腸は「いいえ」と言っています。

コード編成に関しては、Derivedの定義または宣言の直後にBase#のものを定義します。これは、それが実際の目的であるためです。typename Base1<Derived> somethingそうすれば、物事をより美しくするために使用できることを覚えておいてください。

編集:ああ、そうです!「使用する」トリックを実行したり、さまざまなリターンタイプを使用したりすることはできませんが、それ以外の場合は簡単です。

class Derived
    : public Base1
    , public Base2
{
    double Base1::foo(){...}
    double Base2::foo(){...}
}

これらの2つのアプローチを組み合わせるには、ひどい、ひどい、素晴らしい方法があるかもしれませんが、コードを使用するときに実際に役立つとは思いません。折り返しご連絡させていただく場合がございます。

于 2010-01-02T04:34:04.337 に答える