在C++中重载流运算符的主要问题
Major issue with overloading my stream operators in C++
我真的需要高级面向对象编程课的帮助!以下是该程序的工作原理;我们正在C++编码,我们将创建一个创建气象站的程序。如果按"1",请输入温度、风速和风向;如果您按"2",如果将为您提供当前的天气读数;如果您按"3",它将为您提供天气历史记录;如果你按"4",你就退出了。此外,它还从文本文件中读取输出并将它们输出到控制台...我让这一切都正常工作。我遇到的问题是我们要重载流(<<和>>)运算符,因此我们不再需要调用 print() 函数。以前,我调用 print 函数来打印当前天气读数以及温度历史记录。我已经排除了我的文件 wind.h 和 wind.cpp因为我甚至还没有开始尝试在那里实现重载;另外,我想我在一篇文章中发布了足够的代码。另外,我应该提到,该程序还读取英语的输出.txt如果用户想要英语或来自piglatin的piglation.txt如果他们想要piglatin。
基本上,我的问题是,如何正确实现运算符流的重载?
资料来源.cpp:
#include <iostream>
#include <string>
#include "temp.h"
#include "Wind.h"
#include "Language.h"
#include <fstream>
#define SIZE 10
using namespace std;
int main()
{
Temperature temp1;
win wind1;
//Temperature p;
string windDir[SIZE];
int windSpeed[SIZE];
int temp[SIZE];
//Tem p1(int temp);
int index=0;
int reply;
int reply2;
int lang;
int count=0;
string STRING1, STRING2, STRING3, STRING4, STRING5, STRING6;
fstream myEngFile;
fstream myPigFile;
ofstream out;
//Language Menu
cout<<"**** Welcome to The Michael Weather Station! n";
cout<<"**** Elcomeway otay Ethay Ichaelmay Eatherway Ationstay! n";
cout<<"Please enter 1 for english ";
cout<<"orway 2 orfay iglatinpay n";
cin>>lang;
cin.clear();
switch(lang){
//English Main Menu
case 1:
//for(int count=0; count<21; count++)
for(int index=0; index<SIZE; index++){
bool menu = true;
while (menu != false){
myEngFile.open ("English.txt");
getline(myEngFile, STRING1);
cout<<STRING1<<"n";
getline(myEngFile, STRING2);
cout<<STRING2<<"n";
getline(myEngFile, STRING3);
cout<<STRING3<<"n";
getline(myEngFile, STRING4);
cout<<STRING4<<"n";
getline(myEngFile, STRING5);
cout<<STRING5<<"n";
cin>>reply;
cin.clear();
myEngFile.close();
switch(reply){
//Gets data in English
case 1:
temp[count]=temp1.getTemp();
windSpeed[count] =wind1.getSpeed();
windDir[count] = wind1.getDirection();
cout<<" n";
count++;
break;
//Prints data in English
case 2:
cout<<"--------------------------------n";
//temp1.printTemp(temp[count-1]);
Temperature p = temp1.getTemp();
//cout<<temp[count-1];
cout<<p;
wind1.printWindMeasurement(windSpeed[count-1], windDir[count-1]);
cout<<" n";
cout<<" n";
break;
//Prints History in English
case 3:
cout<<"---------------------------------- n";
//for(int index=SIZE%count; index<SIZE; index++){
for(int i=0; i<count; i++){
//temp1.printTemp(temp[i]);
cout<<temp[i];
wind1.printWindMeasurement(windSpeed[i], windDir[i]);
cout<<"n";
}
break;
//Exits...In English?
case 4:
cout<<"Exiting............. n";
menu= false;
break;
//Cheacks to see that only 1,2,3, or 4 is entered
default:
cout<<"Please enter 1,2,3, or 4 only!!! n";
cout<<" n";
} //Switch(reply) in english
} //While loop in english
return 0;
} //For loop in english
break;
//PigLatin Main Menu
case 2:
for(int index=0; index<SIZE; index++){
bool menu = true;
while (menu != false){
myPigFile.open ("PigLatin.txt");
getline(myPigFile, STRING1);
cout<<STRING1<<"n";
getline(myPigFile, STRING2);
cout<<STRING2<<"n";
getline(myPigFile, STRING3);
cout<<STRING3<<"n";
getline(myPigFile, STRING4);
cout<<STRING4<<"n";
getline(myPigFile, STRING5);
cout<<STRING5<<"n";
getline(myPigFile, STRING6);
cout<<STRING6<<"n";
cin>>reply2;
cin.clear();
myPigFile.close();
switch(reply2){
//Gets data in PigLatin
case 1:
temp[count]=temp1.getTemp2();
windSpeed[count] =wind1.getSpeed2();
windDir[count] = wind1.getDirection2();
cout<<" n";
count++;
break;
//Prints data in PigLatin
case 2:
cout<<"----------------------------------n";
//temp1.printTemp2(temp[count-1]);
cout<<temp[count-1];
wind1.printWindMeasurement2(windSpeed[count-1], windDir[count-1]);
cout<<" n";
cout<<" n";
break;
//Prints History in PigLatin
case 3:
cout<<"------------------------------------ n";
//for(int index=SIZE%count; index<SIZE; index++){
for(int i=0; i<count; i++){
//temp1.printTemp2(temp[i]);
cout<<temp[i];
wind1.printWindMeasurement2(windSpeed[i], windDir[i]);
cout<<"n";
}
break;
//Exits...in PigLatin?
case 4:
cout<<"exitingway............. n";
menu= false;
break;
//Checks to see only 1,2,3, or 4 is entered
default:
cout<<"Easeplay enterway 1,2,3, orway 4 onlyway!!! n";
cout<<" n";
} //Switch (Reply2) in piglatin
} //While loop for PigLatin Main Menu
return 0;
} //For loop for PigLatin Main Menu
break;
} //switch(Lang)
} //Main
温度.cpp:
#include "temp.h"
#include "Language.h"
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
// Lang La;
fstream myEngFile5;
string tempLine5;
string tempLine6;
//string tempLine1; // from language file
/**** Keep the getTemp() method, but get rid of the print method
and overload the operators there*******/
ostream &operator<<( ostream &out, const Temperature &p) //&f
{
//int far=0;
fstream myEngFile1;
string tempLine1;
myEngFile1.open ("English.txt");
myEngFile1.seekg(194);
getline(myEngFile1, tempLine1);
//La.getTempLang();
out<<p.tempLine1<<endl; // What is the Temperature?
// cin>>p; //f
return out;
//myEngFile1.close();
}
/*int Temperature::getTemp()
{
int value=0;
fstream myEngFile1;
string tempLine1;
myEngFile1.open ("English.txt");
myEngFile1.seekg(194);
getline(myEngFile1, tempLine1);
cout<<tempLine1<<"n"; // What is the Temperature?
cin>>value;
return value;
myEngFile1.close();
}*/
int Temperature::getTemp2()
{
int value=0;
fstream myPigFile1;
string tempLine1;
myPigFile1.open ("PigLatin.txt");
myPigFile1.seekg(254);
getline(myPigFile1, tempLine1);
cout<<tempLine1<<"n"; //What is the Temperature? in piglatin
cin>>value;
return value;
myPigFile1.close();
}
/*void Tem::printTemp(int temper)
{
fstream myEngFile5;
string tempLine5;
string tempLine6;
myEngFile5.open("English.txt");
myEngFile5.seekg(335);
getline(myEngFile5, tempLine5);
cout<<tempLine5<<temper; //The Temperature is
myEngFile5.seekg(356);
getline(myEngFile5, tempLine6);
cout<<tempLine6<<"n"; //F
}*/
ostream &operator<<( ostream &out, const Temperature p)
{
out<<tempLine5<<p.value; //The Temperature is __
out<<tempLine6<<"n"; //F
return out;
}
istream &operator>>( istream &in, Temperature &p)
{
//in>>p.value;
myEngFile5.open("English.txt");
myEngFile5.seekg(335);
getline(myEngFile5, tempLine5);
in>>tempLine5;
myEngFile5.seekg(356);
getline(myEngFile5, tempLine6);
in>>tempLine6;
return in;
}
/*void Tem::printTemp2(int temper)
{
fstream myPigFile4;
string tempLine5;
string tempLine6;
myPigFile4.open("PigLatin.txt");
myPigFile4.seekg(445);
getline(myPigFile4, tempLine5);
cout<<tempLine5<<temper; //The temperature is __ (in piglatin)
myPigFile4.seekg(473);
getline(myPigFile4, tempLine6);
cout<<tempLine6<<"n"; //fay
}*/
温度:
#ifndef TEMP
#define TEMP
#include <fstream>
#include <string>
using namespace std;
//int index=0;
class Temperature
{
int value;
//char unit;
public:
string tempLine1;
int getTemp();
int getTemp2();
Temperature()
{
value=0;
//unit='F';
}
Temperature(int v/*, char u*/)
{
value=v;
//unit=u;
}
friend ostream &operator<<(ostream &out, const Temperature &p); // needs 'friend' i think
friend istream &operator>>(istream &in, Temperature &p);
//friend ostream operator<<(ostream out, const Temperature p);
//friend istream operator>>(istream in, Temperature &p);
//void printTemp(int temper);
//void printTemp2(int temper);
};
#endif
所以。这是第一点。马的评论完全正确。您的问题中有大量不相关的代码。
因此,首先,让我们将其删除。并将问题的范围缩小到某人可能愿意阅读的大小。
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
class Temperature
{
private:
int value;
public:
Temperature(): value(0) {
}
explicit Temperature(int v): value(v) {
}
friend ostream &operator<<(ostream &out, const Temperature &p);
friend istream &operator>>(istream &in, Temperature &p);
};
ostream &operator<<(ostream &out, const Temperature &p)
{
fstream myEngFile1;
string tempLine1;
myEngFile1.open ("English.txt");
myEngFile1.seekg(194);
getline(myEngFile1, tempLine1);
out << p.tempLine1 << endl; // What is the Temperature?
out << tempLine5 << p.value; //The Temperature is __
out << tempLine6 << "n"; //F
return out;
}
istream &operator>>( istream &in, Temperature &p)
{
//in>>p.value;
myEngFile5.open("English.txt");
myEngFile5.seekg(335);
getline(myEngFile5, tempLine5);
in>>tempLine5;
myEngFile5.seekg(356);
getline(myEngFile5, tempLine6);
in>>tempLine6;
return in;
}
int main() {
Temperature x;
std::cin >> x;
std::cout << x << std::endl;
}
这或多或少是你的代码,但删除了你的注释之类的东西(为什么我关心你的温度等级将来会使用 F/C 比较)。另外,让我们摆脱所有菜单结构。我也不在乎这个,你说它工作正常。
所以,现在我们有合理数量的代码可以查看,所以让我们展示一个合理的 ostream 和 istream 重载实现。
#include <iostream>
#include <string>
#include <fstream>
class Temperature
{
private:
int value;
public:
Temperature(): value(0) {
}
explicit Temperature(int v): value(v) {
}
friend std::ostream &operator<<(std::ostream &out, const Temperature &p);
friend std::istream &operator>>(std::istream &in, Temperature &p);
};
std::ostream &operator<<(std::ostream &out, const Temperature & p)
{
out << "Temperature(" << p.value << ")";
return out;
}
std::istream &operator>>( std::istream &in, Temperature &p)
{
in >> p.value;
return in;
}
int main() {
Temperature x;
std::cin >> x;
std::cout << x << std::endl;
}
如果我们执行这个....
[2:48pm][wlynch@watermelon /tmp] ./foo
123
Temperature(123)
[2:48pm][wlynch@watermelon /tmp] ./foo
-9000
Temperature(-9000)
相关文章:
- 一个关于在C++中重载布尔运算符的问题
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 运算符继承和 cpp 核心准则 c.128 的问题
- 在C++中使用重载提取运算符时出现问题
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- 关于条件块的问题与&&运算符有关
- 重载运算符与添加问题
- 加、乘、除、减复数的问题 C++ - 运算符重载
- 我需要这方面的帮助C++在使用逻辑运算符时是/否问题
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- 如何解决不明确的运算符过载问题?
- 屏幕插入运算符<<的运算符过载问题
- 如何通过使用 2 位或更多数字的 XOR 运算符来执行此操作C++问题
- 在 C++ 的自定义运算符中删除与删除[](不同于常见的删除与删除[]问题)
- 用户定义的文本运算符(在原始模式下)存在问题
- 关于重载 -> 运算符中 const 关键字的特定位置的问题
- 字符 * 未从重载运算符或内存管理问题正确返回
- constexpr 运算符重载使用参数的问题
- c++中重载输入运算符的问题
- 有趣的问题运算符重载