2017-10-25 2 views
2

Ich versuche, den Operator = auf der Linie 9 in dem folgenden Code zu überlasten:Überlastung = Operator, kann sie nicht an der Arbeit

void searchContact(vector<Person> &people){ 
    string searchTerm; 
    vector<Person>::iterator it; 

    cout << endl; 
    cout << "Enter search term: "; 
    getline(cin, searchTerm); 

    it = find(people.begin(), people.end(), searchTerm); 

    if (it != people.end()){ 
     cout << "Element found in: " << *it << '\n'; 
    }else{ 
     cout << "Element not found\n"; 
    } 
} 

Mein Ansatz ist dies:

int data; 

    Person& operator=(Person& a) { return a; } 
    Person& operator=(int a) { 
    data = a; 
    return *this; 
    } 

I bekomme ich diesen Fehler:

class.cpp:129:30: error: ‘Person& operator=(Person&)’ must be a nonstatic member function 
    Person& operator=(Person& a) { return a; } 
          ^
class.cpp:130:26: error: ‘Person& operator=(int)’ must be a nonstatic member function 
    Person& operator=(int a) { 

Was ist falsch mit meinem Ansatz, oder mache ich alles falsch von Anfang an?

+4

Sind Sie sicher, dass Sie eine * Zuordnung * Operator erstellen? Und kein Vergleich-für-gleich '== Operator? –

+0

Für die Fehler, die Sie erhalten, versuchen Sie bitte, ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) zu erstellen, um uns zu zeigen. –

+0

Schließlich empfehle ich Ihnen, [diese Referenz der kanonischen Implementierungen von überladenen Operatoren] (http://en.cppreference.com/w/cpp/language/operators#Canonical_implementations) zu lesen, weil Ihr Kopierzuweisungsoperator falsch ist (es tut nicht Kopiere nichts für Anfänger. –

Antwort

0

Zuerst Sie sind Überlastung des falschen Betreibers. std::find() verwendet operator== (Vergleich) anstelle von operator= (Zuweisung). Und da Sie eine std::string an std::find() übergeben, benötigen Sie eine operator==, die eine std::string als Eingabe verwendet, nicht eine Person.

Zweitens versuchen Sie, die Operatoren als unäre Operatoren zu implementieren, was bedeutet, dass sie nicht statische Mitglieder Ihrer Person Klasse sein müssen. Der Compiler beklagt sich darüber, dass sie es nicht sind.

Drittens, wenn std::find() eine Übereinstimmung findet, sind vorbei Sie *it zu std::cout, so dass Sie ein überladenes operator<< benötigen, die ein Person für die Ausgabe erfolgt.

versuchen, etwas wie folgt aus:

class Person 
{ 
public: 
    ... 

    bool operator==(const string &rhs) const 
    { 
     // compare members of *this to rhs as needed... 
     return ...; // true or false 
    } 

    /* alternatively: 
    friend bool operator==(const Person &lhs, const string &rhs) 
    { 
     // compare members of lhs to rhs as needed... 
     return ...; // true or false 
    } 
    */ 

    friend ostream& operator<<(ostream &out, const Person &p) 
    { 
     // output p to out as needed... 
     return out; 
    } 

    ... 
}; 

Dann wird Ihr Suchcode arbeiten:

void searchContact(vector<Person> &people) 
{ 
    cout << endl; 
    cout << "Enter search term: "; 

    string searchTerm; 
    getline(cin, searchTerm); 

    vector<Person>::iterator it = find(people.begin(), people.end(), searchTerm);  

    if (it != people.end()) { 
     cout << "Element found in: " << *it << '\n'; 
    } else { 
     cout << "Element not found\n"; 
    } 
} 
0
#include <iostream> 
#include <vector> 
#include <algorithm> 

using namespace std; 

class Person{ 

private: 
    int data; 

public: 
    Person(int data) 
    { 
     this->data = data; 
    } 

    int getData() 
    { 
     return data; 
    } 

    friend bool operator==(const Person &lhs, const int rhs); 
}; 
bool operator== (const Person &lhs, const int rhs) 
{ 
    return lhs.data == rhs; 
} 

void searchContact(std::vector<Person> &people){ 
    int searchTerm = 1; 
    vector<Person>::iterator it; 

    it = find(people.begin(), people.end(), searchTerm); 

    if (it != people.end()){ 
     cout << "Element found in: " << it->getData() << '\n'; 
    }else{ 
     cout << "Element not found\n"; 
    } 
} 



int main(int argc, char **argv) 
{ 
    std::vector<Person> list1 = {1, 2, 3, 4}; 
    std::vector<Person> list2 = {1, 2, 3, 5}; 
    std::vector<Person> list3 = {1, 3, 7, 6, 9, 5, 2, 4}; 

    searchContact(list1); 
    searchContact(list2); 
    searchContact(list3); 
} 

Ich weiß nicht, was Sie wollen. Bitte zeigen Sie Ihren vollständigen Code und sagen Sie, was Sie wollen.

, wenn Sie Element im Vektor finden möchten, können Sie so schreiben (nicht String. Wenn ou Zeichenfolge finden wollen, nur int String ändern und erhalten Daten mit cin oder usw.)

+0

'(* it) .getData()' kann auch geschrieben werden als 'it-> getData()' –

+0

oh, ich vergaß thx –