【问题标题】:overloading friend operator >> for template class为模板类重载友元运算符>>
【发布时间】:2021-05-18 21:40:45
【问题描述】:

如何让用户使用重载的友元运算符将值分配给半径>>?我不知道为什么会收到此错误。只有当我在 Circle 构造函数中显式地为 r 赋值时,我才不会收到此错误。请让我觉得有意义:(

输出:

代码:

#include <iostream>

template <class T>
 class Circle {
    private:
        T radius;
        double area;
    public: 
        Circle(T r){    //constructor
            radius = r;
            area =  3.14 * (radius*radius);
        }

        friend std::istream& operator>> (std::istream & input, Circle<T> circle1){ //friend function 
            input >> circle1.radius;
            return input;
        }
        friend std::ostream& operator<< (std::ostream & output, const Circle<T> circle1){ //friend function 
          output << "\nRadius: "<< circle1.radius << "\nArea: "<< circle1.area;
          return output;
        }
        void  operator+ (T n) { //member function
          radius += n;
        }     
};


int main()
{
    Circle<int> circle2;
    std::cin >> circle2;
    std::cout << circle2;

    return 0;
}

【问题讨论】:

  • 嘿朋友...您必须添加一个空的构造函数才能工作... Circle(){ }....... ......... Circle circle2 搜索一个空的构造函数...如果你有 Circle circle2(5) 它会工作,因为你有一个构造函数
  • 你也错过了Circle参数的reference

标签: c++ class templates operator-overloading friend-function


【解决方案1】:

根据编译器消息,您似乎正在创建一个没有任何参数的类的对象,因此调用了该类的默认构造函数。由于您已经实现了类的构造函数(即使是参数化构造函数),编译器现在不会自动添加默认构造函数。

我在您的代码中注意到的另一件事是,在重载的朋友operator&gt;&gt; 中,您按值而不是按引用获取对象,因此您作为输入输入的任何值都是无用的,并且不会保存在预期中目标对象。

同样地,对于你的重载朋友operator&lt;&lt;,你不需要将它作为一个值的常量对象,而是一个引用的常量对象就可以了,而且效率也更高。 最后,您还应该考虑在将新的半径值作为用户输入后重新计算圆的面积。

所以您需要这样做(为了清楚起见,我删除了operator+,但请随时将其重新添加):

  1. 要求编译器定义默认构造函数:
#include <iostream>

template <class T>
 class Circle {
    private:
        T radius;
        double area;
        void update_radius() {
            area = 3.14 * (radius * radius);
        }
    public: 
        Circle() = default;
        Circle(T r){    //constructor
            radius = r;
            update_radius();
        }


        friend std::istream& operator>> (std::istream & input, Circle<T> &circle1){ //friend function 
            input >> circle1.radius;
            circle1.update_radius();
            return input;
        }
        friend std::ostream& operator<< (std::ostream & output, const Circle<T> &circle1){ //friend function 
          output << "\nRadius: "<< circle1.radius << "\nArea: "<< circle1.area;
          return output;
        }
};


int main()
{
    Circle<int> circle2;
    std::cin >> circle2;
    std::cout << circle2;

    return 0;
}
  1. 为单参数构造函数提供默认值
#include <iostream>

template <class T>
 class Circle {
    private:
        T radius;
        double area;
        void update_radius() {
            area = 3.14 * (radius * radius);
        }
    public: 
        Circle(T r = T{}){    //constructor
            radius = r;
            update_radius();
        }


        friend std::istream& operator>> (std::istream & input, Circle<T> &circle1){ //friend function 
            input >> circle1.radius;
            circle1.update_radius();
            return input;
        }
        friend std::ostream& operator<< (std::ostream & output, const Circle<T> &circle1){ //friend function 
          output << "\nRadius: "<< circle1.radius << "\nArea: "<< circle1.area;
          return output;
        }
};


int main()
{
    Circle<int> circle2;
    std::cin >> circle2;
    std::cout << circle2;

    return 0;
}

【讨论】:

  • 非常感谢您帮我解决问题!!!
猜你喜欢
  • 2011-06-07
  • 2010-11-20
  • 2011-05-08
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多