2016-11-04 5 views
-3

Für dieses Projekt gibt es eine verknüpfte Liste der Informationen einer Person, die aus Vornamen, Nachnamen, einer ganzen Zahl und einem Doppel besteht. Es sieht so aus:C++ Wie man Informationen vom Knoten mit mehreren Parametern abruft

void DonorList::addDonor(string firstName, string lastName, int memberID, double donation) 
{ 
    Node *pNode = new Node(DonorType(firstName, lastName, memberID, donation), nullptr); 

    if (first == nullptr) 
    { 
     first = pNode; 
     last = pNode; 
    } 
    else 
    { 
     last->setLink(pNode); 
     last = pNode; 
    } 
} 

Er erbt von der DonorType-Klasse. Was mich betrifft, ist, wie ich nur einen Parameter von den 4 in einer Suchfunktion zusammenbringen kann. Ich habe versucht, die folgenden:

bool DonorList::searchID(int memberNumber) 
{ 
    Node *current = first; 
    bool found = false; 
    while (current != nullptr || !found) 
    { 
     if (current->getDonor() == memberNumber) 
     { 
      found = true; 
     } 
    } 
    return found; 
} 

Aber natürlich ist es nicht funktioniert, weil ich nicht vergleichen kann strom-> getDonor() (der Knoten vom Typ DonorType) zu memberNumber (die ein int). Wenn es keine Hilfe ist, ist dies die Node-Klasse in der Header-Datei:

class Node 
{ 
public: 
    Node(){} 
    Node(const DonorType& theDonor, Node *theLink) 
     : donor(theDonor), link(theLink){} 
    Node* getLink() const { return link; } 
    DonorType getDonor() const { return donor; } 
    void setDonor(const DonorType& theDonor) 
     { donor = theDonor; } 
    void setLink(Node *theLink) { link = theLink; } 
private: 
    DonorType donor;   
    Node *link;  //pointer that points to next node 
}; 

So ziemlich im Moment bin ich sehr verloren, wie ich die memberNumber Informationen in den Knoten, um eine Suche zugreifen kann Funktion zu tun . Jede Hilfe würde sehr geschätzt werden, danke! Dieses Projekt hat tatsächlich eine Menge mehr Dateien, aber ich habe mein Bestes getan, um das einzubeziehen, was meiner Meinung nach für das Problem relevant ist.

Edit: Hier ist die DonorTypen Klasse:

class DonorType : public MemberType 
{ 
public: 
    DonorType(); 
    DonorType(const string& firstName, const string& lastName, const int& memberNumber, const double& donationAmount); 

    void setDonorInfo(string &firstName, string &lastName, int &memberNumber, double &donationAmount); 
    void setAmountDonated(double &donationAmount); 

    double getAmountDonated() const; 

    void printDonor() const; 
    void printDonation() const; 

    ~DonorType(); 

private: 
    double donation; 
}; 

Edit2: Member Klasse

class MemberType 
{ 
public: 
    MemberType(); 
    MemberType(const string& firstName, const string& lastName, const int& memberNumber); 

    void setMemberInfo(const string& firstName, const string& lastName, const int& memberNumber); 

    string getFirstName() const; 
    string getLastName() const; 
    int getMembershipNo(); 

    void printName() const; 
    void printMemberInfo() const; 

    ~MemberType(); 

private: 
    string fname; 
    string lname; 
    int idnum; 
}; 
+0

wir die DonorType Klasse sehen müssen. Obwohl das seltsam scheint, dass DonorType den Namen des Spenders, die ID usw. enthält – pm100

+0

Es gibt nichts im gezeigten Code, der "von der DonorType-Klasse erbt", wie Sie behaupten. Sieht so aus, als bestünde ein Mangel an einem guten Verständnis der grundlegenden C++ - Konzepte. Dies ist nicht etwas, das im Rahmen einer kurzen Antwort auf stackoverflow.com behandelt werden kann. Um in der Lage zu sein, eine klare Frage zu kommunizieren, die beantwortbar ist und in der Lage ist, unter Verwendung der richtigen Terminologie und allgemeiner Begriffe zu kommunizieren. –

+2

und warum verwenden Sie nicht std :: list – pm100

Antwort

3

Node::getDonor() gibt ein DonorType Objekt, das Methoden für den Zugriff auf die einzelnen Werte hat, zB:

bool DonorList::searchID(int memberNumber) 
{ 
    Node *current = first; 
    while (current) 
    { 
     if (current->getDonor().getMembershipNo() == memberNumber) 
     { 
      return true; 
     } 
     current = current->getLink(); // <-- you also need to add this! 
    } 
    return false; 
} 

Nebenbei bemerkt, würde ich vorschlagen, Chan Ging Node::getDonor(), um stattdessen eine DonerType& Referenz zurückzugeben. Auf diese Weise erstellen Sie nicht jedes Mal Kopien von Daten, wenn getDonor() aufgerufen wird, und auch so, dass Dinge wie node->getDonor().set...() wie erwartet funktionieren.

Auch Ihre addDonor() Implementierung kann dies vereinfacht werden:

void DonorList::addDonor(string firstName, string lastName, int memberID, double donation) 
{ 
    Node *pNode = new Node(DonorType(firstName, lastName, memberID, donation), nullptr); 

    if (!first) 
     first = pNode; 

    if (last) 
     last->setLink(pNode); 
    last = pNode; 
} 
+0

Interessant! Ich änderte es zu "current-> getDonor(). GetMembershipNo() == memberNumber" wie Sie vorgeschlagen und jetzt bekomme ich Fehler C3867 ('MemberType :: getMembershipNo': Nicht-Standard-Syntax; Verwenden Sie '&', um einen Zeiger zu erstellen zu Mitglied). Es ist anscheinend eine Art Vererbungsfrage? Das ist auch zusammen mit 2 anderen Fehlern, die '==' sind: keine Umwandlung von 'int' in 'int (_thiscall MemberType: *) (void) und' == ':' int (_thiscall MemberTyupe: *) (void); unterscheidet sich in Ebenen der Indirektion von "int".Oh, aber das ist nur ein Laufzeitfehler, da der Compiler sich nicht mehr beschwert, wenn ich nicht versuche zu debuggen. – BaloneyOs

+0

Die Anweisung 'if (current-> getDonor(). GetMembershipNo() == memberNumber)' kann diese Fehler nicht erzeugen. Wahrscheinlicher ist, dass Sie es stattdessen als 'if (current-> getDonor(). GetMembershipNo == memberNumber)' geschrieben haben. Beachten Sie die fehlende Klammer in 'getMembershipNo'. –

+0

Whoops, danke für den Tippfehler. Es läuft zumindest jetzt. – BaloneyOs

2

Sie benötigen

bool DonorList::searchID(int memberNumber) 
{ 
    Node *current = first; 
    bool found = false; 
    while (current != nullptr || !found) 
    { 
     if (current->getDonor().getMembershipNo() == memberNumber) 
     { 
      found = true; 
     } 
     else current = current->getLink(); 
    } 
    return found; 
} 
+0

Sie erhöhen nicht "current", wenn also der erste Knoten keine Übereinstimmung ist, stecken Sie in einer Endlosschleife fest. –

+0

:-) Ich nahm an, dass der ganze Code korrekt war, abgesehen von dem Bit, das die Membernummer testet. fixed – pm100

+0

'Node :: link' ist' private' und 'DonorList' ist kein' Freund' von 'Node', also' current = current.link; 'wird nicht funktionieren (und ist sowieso eine falsche Syntax, du brauchst' - > 'statt' .'). –