2016-06-02 13 views
-1
class Employee 
{ 
public: 
    Employee(const string& fName, const string& lName, float salary) { 
     mSalary = salary; 
     mFirstName = fName; 
     mLastName = lName; 
    } 

    static Employee create() { 
     string input1, input2; 
     float sal; 
     cout << "Enter first name: "; 
     cin >> input1; 
     cout << "\nEnter last name: "; 
     cin >> input2; 
     cout << "\nEnter salary here: "; 
     cin >> sal; 
     cout << "\n"; 
     Employee emp(input1, input2, sal); 
     return emp; 
    } 

    virtual void printStats() { 
     cout << "===============================================\n"; 
     cout << "First name:\t\t" << mFirstName << endl; 
     cout << "Last name:\t\t" << mLastName << endl; 
     cout << "Salary:\t\t\t" << mSalary << endl; 
    } 

    friend ostream& operator<<(ostream& outFile, Employee& emp) { 
     emp.print(outFile); 
     return outFile; 
    } 


    virtual string getName() { 
     return mFirstName; 
    } 

protected: 
    virtual void print(ostream& str) { 
     str << "Name: " << mFirstName << " " << mLastName << endl; 
     str << "Salary" << mSalary << endl; 
    } 
    string mFirstName; 
    string mLastName; 
    float mSalary; 
}; 

In eigener Klasse namens Datenbank, habe ich diese Methode:Overloading operator << nicht funktioniert

void showEmployees() { 
     int counter = 1; 
     for (Employee* e : data) { 
      cout << "\n["<<counter<<"]\n"<<e<<"\n"; 
      counter++; 
     } 
    } 

Wenn ich diese Methode verwenden, bekomme ich nur die Speicheradresse. Auch ich weiß, dass die Implementierungen in der Header-Datei sind (ich war nur faul).

Making operator<< virtual?

ich diesen Rat hier gefolgt, so dass ich effektiv Mitarbeiter in einen ostream-Objekt einfügen kann, aber es gibt mir nur eine Speicheradresse ... Ich, dass Ostream Rückkehr & mir eine Adresse geben, aber ich don Ich weiß nicht, was ich sonst noch tun könnte.

+1

'cout <<" \ n ["<< counter <<"] \ n "<< * e <<" \ n ";' – songyuanyao

Antwort

1

Sie versuchen, einen Zeiger auf die Employee zu drucken, deshalb erhalten Sie die Adresse. Nur den Zeiger dereferenzieren:

cout << "\n[" << counter << "]\n" << *e << "\n"; 
0

e ist ein Zeiger auf Employee wie hier definiert:

for (Employee* e : data) { 

Also, wenn Sie drucken, erhalten Sie eine Adresse drucken. Wenn Sie den Wert von e darauf drucken möchten, müssen Sie dereferenzieren:

cout << "\n[" << counter << "]\n" << *e << "\n"; 
//         ^-- here 
0

Ihr Problem ist, dass Sie Ihre Ausgabe-Operator wie folgt definiert:

ostream& operator<<(ostream& outFile, Employee& emp) 

Und Sie nennen es durch ein vorübergehendes Zeiger ...

..... 
for (Employee* e : data) { 
     cout << "\n["<<counter<<"]\n"<<e<<"\n"; 
     ..... 

sollten Sie Ihre Bediener neu definieren zu nehmen Employee durch const&:

ostream& operator<<(ostream& outFile, const Employee& emp) 

Und nennen Sie es mögen:

..... 
for (Employee* e : data) { 
     cout << "\n["<<counter<<"]\n"<< *e<<"\n"; 
     ..... 

Denken Sie auch über const-correctness und konst auf Ihre print memeber Funktion hinzuzufügen.

virtual void print(ostream& str) const;