2017-11-17 6 views
0

Ich finde es momentan unmöglich, ein Auftreten von unendlicher Rekursion in meinem Code zu beheben.C++: Fehler beim Überladen von E/A-Operatoren

ich die folgenden Header haben, die die Proces-Klasse definiert:

#pragma once 
#include <iostream> 
class Proces { 
    std::string name; 
    int maxWaitTime; 
    int timeToFinish; 
    int timeWaited; 
    int timeProcessed; 

public: 
    Proces(std::string n, int mwt = 1, int ttf = 1) :name(n), maxWaitTime(mwt), timeToFinish(ttf), timeWaited(0), timeProcessed(0) {} 
    bool process(int a = 1) { timeProcessed += a; return isComplete(); } 
    bool isComplete() { return timeProcessed >= timeToFinish; } 
    bool wait(int a = 1) { timeWaited += a;return maxWaitReached(); } 
    bool maxWaitReached() { return maxWaitTime <= timeWaited; } 
    friend bool operator<(const Proces& a, const Proces& b); 
    friend bool operator>(const Proces& a, const Proces& b); 
    friend std::ostream &operator<<(std::ostream &output, const Proces& a); 
    friend std::istream &operator>>(std::istream &input, const Proces& a); 
}; 

Dann wird für die Umsetzung der Betreiber, die ich habe:

#include "proces.h" 

    bool operator<(const Proces & a, const Proces & b) 
    { 
     if (a.timeWaited != b.timeWaited) 
      return a.timeWaited < b.timeWaited; 
     else 
      return a.maxWaitTime < b.maxWaitTime; 
    } 

    bool operator>(const Proces & a, const Proces & b) 
    { 
     return ! (a < b); 
    } 

    std::ostream & operator<<(std::ostream & output, const Proces & a) 
    { 
     output << a.naziv << " MWT:" << a.maxWaitTime << " TTC:" << a.timeToFinish << " WT:" << a.timeWaited << " TP:" << a.timeProcessed; 
     return output; 
    } 

    std::istream & operator>>(std::istream & input,Proces & a) 
    { 
     input >> a.name >> a.maxWaitTime >> a.timeToFinish; 
     a.timeWaited = 0; 
     a.timeProcessed = 0; 
     return input; 
    } 

Dies führte zu zwei (soweit Ich weiß, ohne Bezug) Probleme:

  1. Verwendung der Ausgabe Betreiber führen t o die unendliche Rekursion geschieht
  2. Der Code selbst kann nicht des Eingangs Bediener ohne kommentieren, um die Durchführung kompiliert werden, da sie die Felder der Klasse behauptet, sind unzugänglich trotz ein Freund der Klasse zu sein

Schweregrad Beschreibung Projekt Datei Leitungsunterdrückung Status Fehler (aktiv) E0265 Mitglied "Proces :: Name" (in Zeile 4 von "[Projektpfad] \ proces.h" deklariert) ist nicht erreichbar aspdz2 [Projektpfad] \ proces. cpp

Hier ist die Hauptfunktion (die < und> Operatoren wie vorgesehen):

#include "proces.h" 

int main() { 
    Proces a{ "Glorious prces",1,2 }; 
    Proces b{ "Glorious prces2",2,2 }; 

    if (a < b)std::cout << "A is lesser" << std::endl; 
    else std::cout << "B is lesser" << std::endl; 

    if (a > b)std::cout << "A is greater" << std::endl; 
    else std::cout << "B is greater" << std::endl; 
    b.wait(-1); 
    if (a < b)std::cout << "A is lesser" << std::endl; 
    else std::cout << "B is lesser" << std::endl; 

    //Infinite recursion happens here: 
    std::cout << b << std::endl; 

} 
+0

std :: string name; Es ist nicht öffentlich. Aus diesem Grund erhalten Sie einen Fehler. –

+1

In Header-Eingabe Operator hat const param, in der Umsetzung nicht. – Whatever

+1

Sie haben einen Tippfehler in der 'operator >>' friend-Deklaration. Entferne das 'const' vom zweiten Argument. –

Antwort

0

Es scheint, dass der Grund für die

Severity Code Beschreibung Projektdatei Linie Unterdrückungszustand Fehler (aktiv) E0265 Mitglied "Proces :: name" (in Zeile 4 der deklarierten "[Projektpfad] \ proces.h") ist nicht zugänglich aspdz2 [Projektpfad] \ proces.cpp

err oder war aufgrund der versehentlichen Aufnahme der const Schlüsselwort in der Erklärung des >> Betreibers; Die Rekursion auf der anderen Seite passierte, weil ich vergaß #include<string>