2016-04-22 2 views
0

neu in C++Erste einen undefinierten Bezugs auf für einen Betreiber von <function

Bevor ich beginne ja diese Hausaufgaben, in der Regel kann ich Dinge herauszufinden, in Ordnung auf meinem eigenen, aber ich bin keine tatsächlichen Fehler auf spezifisches bekommen Linien, so ist dies für mich schwierig.

Mein Code:

#include <string> 
#include <iostream> 
using namespace std; 

class JobBid{ 

    private: 
     friend ostream& operator<<(ostream&, const JobBid&); 
     int bid; 
     int quote; 



    public: 
     JobBid& operator() (int, int); 
     bool operator<(const smallest) 
}; 

ostream& operator<<(ostream& out, const JobBid& baq){ 

    out << "Bid #: " << baq.bid << " Quote $: " << baq.quote << endl; 
    return out; 
} 

JobBid& JobBid::operator()(int b, int q){ 

    bid = b; 
    quote = q; 
} 



int main() 
{ 

    int b1; 
    int b2; 
    int b3; 
    int b4; 
    int q1; 
    int q2; 
    int q3; 
    int q4; 

    int smallestbid; 
    int smallestquote; 

    const int size = 4; 
    JobBid JBArray[size]; 

    cout << "Enter the bid number for the first bid:" << endl; 
    cin >> b1; 

    cout << "Now enter the quote price for the first bid:" << endl; 
    cin >> q1; 

    cout << "Enter the bid number for the second bid:" << endl; 
    cin >> b2; 

    cout << "Now enter the quote price for the second bid:" << endl; 
    cin >> q2; 

    cout << "Enter the bid number for the third bid:" << endl; 
    cin >> b3; 

    cout << "Now enter the quote price for the third bid:" << endl; 
    cin >> q3; 

    cout << "Enter the bid number for the fourth bid:" << endl; 
    cin >> b4; 

    cout << "Now enter the quote price for the fourth bid:" << endl; 
    cin >> q4; 

    JBArray[1](b1, q1); 
    JBArray[2](b2, q2); 
    JBArray[3](b3, q3); 
    JBArray[4](b4, q4); 

    cout << JBArray[1] << JBArray[2] << JBArray[3] << JBArray[4] << endl; 

    JobBid smallest = JBArray[0] ; 
    for (int i=1; i < sizeof(JBArray)/sizeof(JBArray[0]); ++i) 
     if (JBArray[i] < smallest) 
      smallest = JBArray[i] ; 

    cout << smallest << '\n' ; 

} 

Ich weiß, dass der Code wahrscheinlich wirklich schlecht ist, aber seine ein Intro-Klasse. So oder so versuche ich, den kleinsten Wert meiner erstellten Array-Liste am Ende des Main zu liefern. Ich habe jedoch festgestellt, dass der Versuch, den '<'-Operator für meinen Typ' JobBid 'zu verwenden, Fehler verursacht hat, also habe ich mich umgesehen und herausgefunden, dass Sie es selbst definieren müssen, denke ich.

Ich habe versucht, so zu tun hier:

bool operator<(const smallest) 

aber ich muss es falsch machen, ich in der Lage war, alle Fehler raus nach, dass (Fehler auf bestimmte Zeilen ich meine), außer jetzt erhalte ich dies:

undefined reference to `JobBid::operator<(JobBid)' 

und ich bin mir nicht sicher, wie es zu beheben ist. Ich denke, die Logik zum Finden des kleinsten Objekts im Array ist richtig, also muss es etwas mit dem weniger als-Zeichen sein.

+1

Haben Sie eine Definition für diesen überladenen Operator? – FCo

+0

Ich denke ich nicht, wie würde ich es definieren? Vermute ich, dass ich mich als Argument am kleinsten nehme? Ich nehme an, ich müsste so etwas tun: JobBid & Operator <() { // aber was würde hier gehen? } – Dante

+1

Ich sehe, Sie versuchen zu vergleichen "JBArray [i] Unick

Antwort

1

Es gibt keine Definition für den überladenen Operator <. Da dies Hausaufgaben sind, werde ich Ihnen nicht genau sagen, wie es geht, aber es sollte sehr ähnlich zu überladenen Operatoren sein, die Sie bereits definiert haben. Versuchen Sie, diese Website zu suchen: http://www.learncpp.com/cpp-tutorial/96-overloading-the-comparison-operators/

Auch die Erklärung ist nicht ganz richtig. Statt

bool operator<(const smallest) 

sollte es

friend bool operator<(const JobBid &left, const JobBid &right); 

Dann Definition sein:

bool operator<(const JobBid &left, const JobBid &right) 
{ 
    // for you to fill in 
} 

Sie ein Semikolon und den Typ für das Argument fehlt.

EDIT: Ich habe auch ein anderes Problem gefunden. Sie definieren JBArray [0] niemals, daher sollte JBSmallestJBArray[1] sein, nicht JBArray[0].

+0

Ich bin super verwirrt, es gibt mir einen Fehler, wenn ich 2 Argumente für die Definition zur Verfügung stellen. Sollte ein Argument das Array sein und eines der 'kleinste' int sein? Wenn Sie den verlinkten Standort betrachten, verweisen sie bei der Definition des gleichen Operators auf die Variable in der Klasse. Also sollte meine Array-Liste und kleinste int auch in der Klasse definiert werden? – Dante

+0

@Dante Ich habe gerade den Post bearbeitet. – FCo

+0

Der Weg, diese Funktion in Ihrem Code aufzurufen, wäre einfach 'JBArray [i] FCo

0

Sie haben verpasst Definition des Begriffs "bool operator < (const kleinste)"

Die Umsetzung des Betreibers

könnte
friend bool JobBid::operator<(const JobBid& smallest) { 
    if(smallest.bid < this.bid && smallest.quote < this.quote) 
      return true; 
    else 
      return false; 
} 
+0

Die Friend-Deklaration des Operators hängt wirklich davon ab, ob eine Klasse auf der linken oder rechten Seite des Aufrufs sein wird. Wenn eine Klasse auf der rechten Seite des Ausdrucks steht und keine implizite Konvertierung in einen Typ bietet, der mit der linken Seite verglichen werden kann, müssen Sie den Operator

1

Ihre Methodendeklaration eine Art fehlt; Sie sagen ihm den Variablennamen und das seine Konstante, aber nicht den Typ. Versuchen Sie folgendes:

bool operator<(const JobBid& jb) const 
{ 
    return (bid < jb.bid) && (quote < jb.quote); 
} 

Ich empfehle die const am Ende des Verfahrens das Hinzufügen des Compilers und Leser zu sagen, dass das Verfahren keine der Datenelemente verändert.

Edit 1
Das Verfahren zur Klasse hinzugefügt werden soll:

class JobBid 
{ 
    private: 
     friend ostream& operator<<(ostream&, const JobBid&); 
     int bid; 
     int quote; 
    public: 
     JobBid& operator() (int, int); 
     bool operator<(const JobBid & jb) const 
     { 
      return (bid < jb.bid) && (quote < jb.quote); 
     } 
}; 

Edit 2: Implementierung außerhalb der Klasse

class JobBid 
    { 
     private: 
      friend ostream& operator<<(ostream&, const JobBid&); 
      int bid; 
      int quote; 
     public: 
      JobBid& operator() (int, int); 
      bool operator<(const JobBid & jb) const; 
    }; 

bool JobBid::operator<(const JobBid & jb) const 
{ 
    return (bid < jb.bid) && (quote < jb.quote); 
} 

bearbeiten 3: Freistehendes Funktion

 class JobBid 
     { 
      private: 
       friend ostream& operator<<(ostream&, const JobBid&); 
       int bid; 
       int quote; 
      public: 
       JobBid& operator() (int, int); 
       friend bool operator<(const JobBid & a, 
             const JobBid & b); 
     }; 

bool operator<(const JobBid & a, const JobBid & b) 
{ 
    return (a.bid < b.bid) && (a.quote < b.quote); 
} 
+0

gibt diese Fehler zurück: 26:34: Fehler: Nicht-Member-Funktion 'bool Operator <(Const JobBid &)' kann nicht cv-Qualifier haben 26:34: Fehler: 'Bool Operator <(Const JobBid &)' muss genau zwei Argumente – Dante

+0

Wo haben Sie es in der Klasse oder außerhalb deklariert? Definieren des Operators innerhalb der Klasse verwendet 1 Parameter. Das Deklarieren der Funktion außerhalb der Klasse erfordert 2 Parameter. –

Verwandte Themen