C++ 超载>>问题
C++ Trouble with overloading >>
我正在开发一个程序,并调试了很多我在里面做错的地方。我只有一个错误,并且在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
中,然后使用这些int
和string
来调用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";
保存月份名称或编号
不需要同时保存月份名称和编号。使用上面的转换数组,您可以在名称和数字之间进行转换
我建议保持月数可变。如果您需要名称,请使用月份编号获取名称,然后处理名称。
体积小,缺陷数量少
编程行业有很多研究表明,程序越长,它的缺陷就越有可能比短程序多。只需单独考虑打字即可。打字的字母越多,打字错误的几率就越大。
利用数据结构来减少程序大小。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用mongocxx驱动程序时包含头文件问题