-2

高度なオブジェクト指向プログラミングのクラスで本当に助けが必要です! プログラムの仕組みは次のとおりです。C++ でコーディングしており、気象ステーションを作成するプログラムを作成します。「1」を押すと、温度、風速、風向が入力されます。「2」を押すと、現在の天気予報が表示されます。「3」を押すと、天気の履歴が表示されます。「4」を押すと終了します。また、テキストファイルから出力を読み取り、コンソールに出力します...すべて正しく機能しています。私が抱えている問題は、ストリーム (<< および >>) 演算子をオーバーロードすることで、print() 関数を呼び出す必要がなくなったことです。以前は、print 関数を呼び出して、現在の天気予報と温度履歴を出力しました。自分のファイル wind.h と wind を除外しました。cpp は、まだオーバーロードを実装しようとしていないためです。さらに、1 回の投稿で十分なコードを投稿したと思います。また、プログラムは、ユーザーが英語を必要とする場合はenglish.txtから出力を読み取り、ピグラチンが必要な場合はpiglatin.txtからピグレーションを読み取ることにも言及する必要があります。

私の質問は、基本的に、オペレーターストリームのオーバーロードを正しく実装するにはどうすればよいですか?

ソース.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

Temp.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
4

1 に答える 1

1

そう。ここが最初のポイントです。mah のコメントは完全に正しいです。あなたの問題には無関係なコードがたくさんあります。

というわけで、まずは削除してみましょう。そして、あなたの問題の範囲を、誰かが読みたがるかもしれないサイズに縮小してください。

#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)
于 2013-11-13T20:47:38.027 に答える