gpt4 book ai didi

c++ - 如何重载运算符而不是同时使用 "Curiously Recurring Template Pattern"和 "Run Time polymorphism"

转载 作者:行者123 更新时间:2023-11-30 05:29:49 24 4
gpt4 key购买 nike

  1. 我只是想在 “Number” 类中重载 + 和 = 运算符

  2. 我想要两个子类 A。 Integer B. Fraction,它实现了“Number”类。目前下面是我的代码的样子。但在这里我使用了静态和运行时多态性范例。如何避免?

代码片段:

数字类:

template<class T>

class Number
{
virtual T& operator= (const T &) = 0;
virtual const T operator+ (const T &) = 0;
virtual void display(std::ostream &) = 0;
};

整数类:

// operator "=" overloading 
Integer& Integer::operator=(const Integer &secondNumber)
{
intValue = secondNumber.intValue;
return *this;
}

// operator "+" overloading
const Integer Integer::operator+(const Integer &secondNumber)
{
Integer temp;
temp.intValue = this->intValue + secondNumber.intValue;
return temp;
}

此外,如果我从我的“数字”类中删除"template",我不能重载 + 运算符,因为它返回类实例,我们不能有一个抽象类的实例,它是“数字类”

此外,如果我不能去掉 virtual 关键字,因为我希望我的 child 实现“数字类”中存在的方法。

请在这里给我一些指导,有没有什么方法可以在代码中同时使用两种类型的范式,即静态和动态。

最佳答案

您需要决定您更喜欢哪种方法,以及为什么您只想使用一种方法。但是我在你的代码中没有看到编译时多态性,你只是在创建一个通用模板的多个实例。这两个实例没有任何共同点,除非它们也继承了一个公共(public)接口(interface)。

关于决定使用哪种方法,而不是看你打算从代码中得到什么,我发现:你需要决定你不需要或可能不希望包含在代码中的功能您的设计。

这里是一个非常有限的要点列表,这些可能是好是坏取决于你的情况:

编译时多态性。

  • 高效;不需要虚拟调用,编译器可以很好地优化代码。
  • 非常严格(没有基本定义的虚函数):没有派生实现,繁荣,没有编译。
  • 基础对象(从动态的角度来看)并不常见,但对于模板实例化而言是独一无二的。
  • 混合大量实例化会产生大量开销(您也可以进一步抽象您的设计以减轻这种情况)。

动态多态性。

  • 独特的(派生的)类型包含一个公共(public)接口(interface)。
  • 只要您使用基指针或引用,您就可以放松一些优化(如果需要,编译时方法可以内联当前源中定义明确且可用的所有内容)。
  • 除非虚函数是纯函数:没有实现,不用担心,没有错误(编译时,你必须发现运行时错误)。

我可以假设你的Number class 你不需要混合类型的数组( Number<int> & Number<float> )。如果是这种情况,编译时解决方案可能是合适的。但是,如果您想创建一个可以对任何形式的 Number 进行操作的函数那么您必须从 Number 中删除模板或者也将函数实现为模板(最终可能会为每个 T 重复代码)。

U用更具体的需求更新您的问题,正确的方法或组合将更加明显。我也会更新这个答案。

我的大部分观点都来自嵌入式系统。需要考虑系统功能才能做出明确的决定。如果您可以在对用户体验影响很小的情况下掠夺资源,那么让代码变得非常抽象和肉眼困惑可能并不值得。

关于c++ - 如何重载运算符而不是同时使用 "Curiously Recurring Template Pattern"和 "Run Time polymorphism",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36254703/

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