0

多くの子クラスを持つ基本クラスがあります。すべての継承クラスで機能するように、基本クラスでテンプレート オペレーター オーバー ローダーを実装するにはどうすればよいですか? + 演算子を使用して作成しようとしましたが、パラメーターが多すぎると不平を言いました。これがこれを行う正しい方法であるかどうかは実際にはわかりません(私はOOPを使い始めたばかりです)ので、より良い方法を考えることができればそれも素晴らしいでしょう.

各メトリック空間がクラスであるライブラリを作成しています。あらゆる空間が継承する基本クラス「操作」を作りたい。

私のテンプレート基本クラス:

#ifndef __libSpace__Operations__
#define __libSpace__Operations__

template< typename T >
class Operations{
public:
    friend T operator+( const T& sp, const T& nsp ){
        return T(sp.dimension + nsp.dimension);
    };
};

#endif

子:

#ifndef __libSpace__EuclidSP__
#define __libSpace__EuclidSP__

#include "Operations.h"

class EuclidSP: public Operations<EuclidSP>{
public:
    EuclidSP(int n = 0, ...);
    ~EuclidSP();

    double* vector();

private:
    int dimension;
    double *vec = new double(dimension);
};

#endif

主要:

#include <iostream>
#include "EuclidSP.h"

int main(int argc, const char * argv[])
{
EuclidSP ob1(3,4.0,5.0,6.0);
EuclidSP ob2(3,2.0,5.0,3.0);
EuclidSP obj3();

obj3 = ob2+ob1;

return 0;
}
4

2 に答える 2

1

メンバーoperator +()には、右側のオペランドという 1 つのパラメーターしかありません。左または最初は常に*thisです。状況に応じて、必要なのは base +、 virtual+または template だけです。operator +()"left" と "right" の 2 つの引数を自由に取ります。

あなたのコードで:

template< typename T >
class Operations{
public:
    friend T operator+( const T& sp, const T& nsp ){
        return T(sp.dimension + nsp.dimension);
    };
};

あなたはメンバーまたは友人が欲しいですか?

フレンドの場合、問題は +() をクラス外で定義する必要があることです。これは単なるフレンドであり、メンバーではありません。

template< typename T >
    T operator+( const T& sp, const T& nsp );

template< typename T >
class Operations{
public:
    friend T operator+<T>( const T& sp, const T& nsp );

};

template< typename T >
    T operator+( const T& sp, const T& nsp )
    {
        return T(sp.dimension + nsp.dimension);
    }

しかし !!!!+() は、基本クラスではなく、派生クラスのプライベート メンバーを使用するため、派生クラスのフレンドである必要があります。私はあなたが再考する必要があると思います;-)あなたのデザイン。オペレーションでディメンションを快適に使用できる場合は、オペレーションの保護されたメンバーになることができますか? すべてのオペレーションにディメンションがありますか?

于 2013-02-20T18:11:23.133 に答える
0

基本クラスは、テンプレート パラメーターとして受け取り、次のように実装することで、派生型クラスを認識している必要がありoperator+ますfriend

template< typename T >
class base
{
    friend T operator+( const T& lhs, const T& rhs )
    {
       // your generic implementation here...
    }
};

派生クラスは、次のように基本クラスから派生します。

class D1 : public base<D1> { ... };
class D2 : public base<D2> { ... };
于 2013-02-20T18:20:34.220 に答える