ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – ‘friend’函数和<<运算符重载:为类重载运算符的正确方法是什么?

2019-09-23 09:07:59  阅读:199  来源: 互联网

标签:c class operator-overloading friend friend-class


在我正在进行的项目中,我有一个Score类,在score.h中定义如下.我试图超载它,当一个<<对它执行操作,_points“”_name被打印. 这是我试图做的事情:

ostream & Score::operator<< (ostream & os, Score right)
{
    os << right.getPoints() << " " << right.scoreGetName();
    return os;
}

以下是返回的错误:

score.h(30) : error C2804: binary 'operator <<' has too many parameters

(此错误实际出现4次)

我设法通过将重载声明为友元函数来使其工作:

friend ostream & operator<< (ostream & os, Score right);

并从score.cpp中的函数声明中删除Score ::(实际上不会将其声明为成员).

为什么这样做,但前一段代码没有?

谢谢你的时间!

编辑

我删除了头文件上的重载的所有提及…但我得到以下(和唯一)错误.二进制’<<' :找不到哪个运算符采用“得分”类型的右手操作数(或者没有可接受的转换)
为什么我的测试在main()中找不到合适的重载? (这不是包括,我查了一下)

以下是完整的分数

#ifndef SCORE_H_
#define SCORE_H_

#include <string>
#include <iostream>
#include <iostream>

using std::string;
using std::ostream;

class Score
{

public:
    Score(string name);
    Score();
    virtual ~Score();
    void addPoints(int n);
    string scoreGetName() const;
    int getPoints() const;
    void scoreSetName(string name);
    bool operator>(const Score right) const;

private:
    string _name;
    int _points;

};
#endif

解决方法:

注意:您可能需要查看operator overloading FAQ.

二元运算符可以是其左侧参数类或自由函数的成员. (某些运算符,如赋值,必须是成员.)由于流运算符的左侧参数是流,因此流运算符必须是流类或自由函数的成员.实现运算符的规范方法<<对于任何类型是这样的:

std::ostream& operator<<(std::ostream& os, const T& obj)
{
   // stream obj's data into os
   return os;
}

请注意,它不是成员函数.另请注意,它使对象按每个const引用进行流式处理.那是因为您不想复制对象以便对其进行流式处理,并且您不希望流式传输也改变它.

有时您希望通过类的公共接口流式传输内部无法访问的对象,因此运算符无法获取它们.然后你有两个选择:将公共成员放入进行流式处理的类中

class T {
  public:
    void stream_to(std::ostream&) const {os << obj.data_;}
  private:
    int data_;
};

并从操作符那里打电话:

inline std::ostream& operator<<(std::ostream& os, const T& obj)
{
   obj.stream_to(os);
   return os;
}

或者让运算符成为朋友

class T {
  public:
    friend std::ostream& operator<<(std::ostream&, const T&);
  private:
    int data_;
};

这样它就可以访问班级的私人部分:

inline std::ostream& operator<<(std::ostream& os, const T& obj)
{
   os << obj.data_;
   return os;
}

标签:c,class,operator-overloading,friend,friend-class
来源: https://codeday.me/bug/20190923/1814760.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有