gpt4 book ai didi

c++ - 模板运算符重载基类

转载 作者:行者123 更新时间:2023-11-28 07:45:24 24 4
gpt4 key购买 nike

我有一个包含许多子类的基类。我将如何在基类中实现加载器上的模板运算符以适用于所有继承类?我尝试使用 + 运算符创建一个,但它提示我的参数太多。我实际上不确定这是执行此操作的正确方法(我刚刚开始使用 OOP),所以如果您能想到更好的方法,那也很好。

我正在创建一个库,其中每个度量空间都是一个类。我想创建一个每个空间都继承的基类“Operations”。

我的模板基类:

#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

child :

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

最佳答案

成员 operator +() 只有一个参数,右操作数。左边或第一个总是 *this。根据您的情况,您只需要一个基础 +、一个虚拟 + 或一个模板。一个免费的 operator +() 有两个参数,“left”和“right”。

在您的代码中:

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

您想要成员(member)还是 friend ?

如果是 friend ,问题是 +() 必须在类外定义,它只是 friend ,不是成员。

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

但是!!!!现在你遇到了真正的问题:+() 使用派生类的私有(private)成员,而不是基类,所以它需要是派生类的友元。我认为您需要重新考虑 ;-) 您的设计。如果您对在操作中使用维度感到很自在……它可以成为操作的 protected 成员吗???您所有的运营都有一个维度?

关于c++ - 模板运算符重载基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14986822/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com