C++ 超载>>问题

C++ Trouble with overloading >>

本文关键字:gt 问题 超载 C++      更新时间:2023-10-16

我正在开发一个程序,并调试了很多我在里面做错的地方。我只有一个错误,并且在stack和其他论坛上读过类似的问题。但他们一次又一次地试图重新尝试,但没有取得积极的结果。

错误显示在标题代码中,它是:

binary">>'未找到接受类型为"重载函数"的右侧操作数的运算符(或没有可接受的转换)

月.h

#ifndef MONTH_H
#define MONTH_H
#include <iostream>
#include <string>
using namespace std;
class Month{
private:
        static string name;
        static int monthNumber;
public:
        //Default Constructor
        Month(){
        setName("January");
        setNumber(1);
        }
        //Input of month only constructor and assigning month number from input of name
        Month(string n){
                name = n;
                setName(n);
                if(name == "January" || name == "january"){
                        setNumber(1);
                }
                else if(name == "February" || name == "february"){
                        setNumber(2);
                }
                else if(name == "March" || name == "march"){
                        setNumber(3);
                }
                else if(name == "April" || name == "april"){
                        setNumber(4);
                }
                else if(name == "May" || name == "may"){
                        setNumber(5);
                }
                else if(name == "June" || name == "june"){
                        setNumber(6);
                }
                else if(name == "July" || name == "july"){
                        setNumber(7);
                }
                else if(name == "August" || name == "august"){
                        setNumber(8);
                }
                else if(name == "September" || name == "september"){
                        setNumber(9);
                }
                else if(name == "October" || name == "october"){
                        setNumber(10);
                }
                else if(name == "November" || name == "november"){
                        setNumber(11);
                }
                else if(name == "December" || name == "december"){
                        setNumber(12);
                }
        }
        //Input of month number only and assigning month name to that number
        Month(int n){  
                setNumber(n);
        }
        Month(int n, string m){
            monthNumber = n;
            name = m;
        }
        //Set the name of the month
        void setName(string n){
                name = n;
        }
        //Set the monthes number (and name for increment and decrement)
        void setNumber(int n){
                monthNumber = n;
                switch(monthNumber){
                case 1:
                        setName("January");
                        break;
                case 2:
                        setName("February");
                        break;
                case 3:
                        setName("March");
                        break;
                case 4:
                        setName("April");
                        break;
                case 5:
                        setName("May");
                        break;
                case 6:
                        setName("June");
                        break;
                case 7:
                        setName("July");
                        break;
                case 8:
                        setName("August");
                        break;
                case 9:
                        setName("September");
                        break;
                case 10:
                        setName("October");
                        break;
                case 11:
                        setName("November");
                        break;
                case 12:
                        setName("December");
                        break;
        }
    }
        //Return the name of the month
        string getName(){
                return name;
        }
        //Return the month number
        int getNumber(){
                return monthNumber;
        }

       //Overload the -- Operator
        Month Month::operator--(int){
        if(monthNumber == 1)
        {
        setNumber(12);
        setName("December");
        }
        else {
        monthNumber++;
        setNumber(monthNumber);
        }
    }
        Month Month::operator--(){
        if(monthNumber == 1)
        {
        setNumber(12);
        setName("December");
        }
        else {
        monthNumber++;
        setNumber(monthNumber);
        }
    }
        //Overload the ++ operator
        Month Month::operator++(int){
        if(monthNumber == 12)
        {
        setNumber(1);
        setName("January");
        }
        else {
        monthNumber++;
        setNumber(monthNumber);
        }
    }
        Month Month::operator++(){
        if(monthNumber == 12)
        {
        setNumber(1);
        setName("January");
        }
        else {
        monthNumber++;
        setNumber(monthNumber);
        }
    }
        //Overloading << and >>
        friend ostream &operator<<(ostream &strm, const Month &obj){
            strm << "# of Month : " << obj.name << " This Corresponds to the month : " << obj.monthNumber << endl;
            return strm;
        }
        //Error here
        //-------------------------------------------------------------------
        //binary'>>' no operator found which takes a right-hand operand of 
        //the type'overloaded-function'(or there is no acceptable conversion)
        //-------------------------------------------------------------------
        friend istream &operator>>(istream &strm, Month &obj) {
            strm >> obj.setNumber >> obj.setName;
            return strm;
        }
};
#endif

来源.cpp

#include "Month.h"
#include <cstdlib>
#include <iostream>
using namespace std;
int main(){
    Month coolio, first(1), second("June");
    coolio++;
    second--;
    ++first;
    cout << "Enter the month number: " << endl;
    cin >> coolio;
    cout << coolio;
    cout << second;
    cout << first;
    return 0;
}

您不能从输入流中读取数据,并将其与方法调用相结合。您需要将数据读取到临时int和临时string中,然后使用这些intstring来调用setter,如下所示:

friend istream &operator>>(istream &strm, Month &obj) {
    int number;
    string name;
    strm >> number >> name;
    obj.setNumber(number);
    obj.setName(name);
    return strm;
}

此外,由于>>被声明为friend,因此可以直接读取obj的成员变量。

以下是一些关于如何简化程序的建议(这样我们其他人就不必费力地阅读数百行代码):

直接分配给成员

您不需要在setNumber方法中调用setName
直接访问name变量。

一个文本案例,一个比较

您的代码将在jUNe情况下失败
在进行比较之前,您可以将月份名称转换为全小写或全大写。这将使您的if-else阶梯减少一半
在网站上搜索"c++转换toupper"。

删除月份比较

有一种奇特的技术可以将月份名称映射到数字,但我们不会使用它。您可以改用数组。让数组索引表示月份编号:

static const char month_number_to_name[13] =
{
  "Nothing",
  "january", "february", "march", "april", "may", "june",
  "july", "august", "september", "october", "november", "december",
};
// ...
std::cout << "The name of month 10 is: "
          << month_number_to_name[10]
          << "n";

保存月份名称或编号

不需要同时保存月份名称和编号。使用上面的转换数组,您可以在名称和数字之间进行转换
我建议保持月数可变。如果您需要名称,请使用月份编号获取名称,然后处理名称。

体积小,缺陷数量少

编程行业有很多研究表明,程序越长,它的缺陷就越有可能比短程序多。只需单独考虑打字即可。打字的字母越多,打字错误的几率就越大。

利用数据结构来减少程序大小。