【问题标题】:Generic friend operator== overload通用友元运算符== 重载
【发布时间】:2022-01-05 18:39:04
【问题描述】:

我目前遇到了一个我无法解决的问题。我是 C++ 世界的初学者。

对于家庭作业,我必须创建一个通用类来表示像 5/6 或 11/4 这样的分数。这个类是通用的,它允许确定提名者和分子的类型(无符号短、无符号、无符号长)。

目标是能够加、减、乘、除和比较分数。在第一阶段,我创建了一个类和运算符重载,允许我做所有需要的事情,但仅限于具有相同类型的类的实例。

现在我想改进现有代码,使其能够在不同类型的部分之间执行操作,例如:Frac<unsigned> == Frac<unsigned short>。但是重载运算符的语法有一些我不明白的地方。

我们以 == 运算符为例:

template <typename T>
bool operator==(const Frac<T>& lhs, const Frac<T>& rhs) {
  return (lhs.numerator == rhs.numerator && lhs.denominator == rhs.denominator);
}

template <typename T>
class Frac {

friend bool operator== <>(const Frac& lhs, const Frac& rhs);

private:
    T numerator, denominator;

};

这是适用于相同类型 Frac 的当前版本。但现在我希望它适用于不同类型的 Frac:

template <typename T>
class Frac;

template <typename T, typename U>
bool operator==(const Frac<T>& lhs, const Frac<U>& rhs){
return (lhs.numerator == rhs.numerator && lhs.denominator == rhs.denominator)
}

template <typename T>
class Frac {

friend bool operator== <>(const Frac& lhs, const Frac& rhs);


private:
    T numerator, denominator;

};

但是当我想比较不同类型的 Frac 时出现编译错误......我不明白,也没有找到任何解决方案具体解释问题是什么以及如何正确实施这种解决方案。

你能帮帮我吗?

我希望我的问题清晰完整。

【问题讨论】:

  • 我会警告您通常不希望发生这种情况。这听起来像是一个伟大的想法,但我可以想到一堆我要验证的极端案例(然后我会担心我错过的所有极端案例)。我会说最好只比较相同类型的对象,并强制用户在比较之前将对象转换为相同类型。
  • 感谢您的建议,这只是一个学术项目。目标是了解类的通用性和基础。但我下次记住它。

标签: c++ operator-overloading friend


【解决方案1】:

您可以通过以下方式执行此操作:

template <typename T>
class Frac {

//friend declaration
template <typename S, typename U> friend
bool operator==(const Frac<S>& lhs, const Frac<U>& rhs);


private:
    T numerator, denominator;

};
template <typename T, typename U>
bool operator==(const Frac<T>& lhs, const Frac<U>& rhs){
return ((lhs.numerator == rhs.numerator) && (lhs.denominator == rhs.denominator));
}

现在您可以根据需要比较 Frac 的不同类型。

【讨论】:

    【解决方案2】:

    当我尝试实现 operator+ 时,我一直遇到问题。编译器告诉我,当我尝试添加两个不同类型的 Frac 时,无法访问私有字段。

    为了解决这个问题,我让我的类对自己友好,这样即使类型不同,Frac 的所有实例都可以访问其他实例的私有字段。这是一个正确的解决方案吗?

    template <typename T>
    class Frac {
    
    //make Frac self-friend to make all instance of Frac friends each others
    // not depending of Frac T type
    template<typename U>
    friend class Frac;
    
    friend std::ostream& operator<< <T>(std::ostream& o, const Frac& rhs);
    
    friend Frac operator+ <>(Frac lhs, const Frac& rhs);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-24
      • 2017-07-26
      • 1970-01-01
      • 2011-04-28
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多