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 +()只有一个参数,即右操作数。左边或第一个总是*this。根据您的情况,您只需要一个 base +、一个 virtual+或一个模板。一个自由operator +()取两个参数,“左”和“右”。

在您的代码中:

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);
    }

但 !!!!现在你遇到了真正的问题:+() 使用派生类的 privat 成员,而不是基类,所以它需要成为派生类的朋友。我认为你需要重新考虑 ;-) 你的设计。如果您在操作中使用维度如此舒适.. 它可以成为操作的受保护成员吗???您的所有运营都有维度吗?

于 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 回答