2017-01-26 9 views
1

Ich halte die folgenden Fehler von meinem Code bekommen:Fehler: keine Member-Funktion in der Klasse deklariert

(Linie 58) Fehler: nein 'std :: string Person :: Modify_Person (Person)' Member-Funktion in der Klasse deklariert 'Person' in Funktion 'int main()':

(Linie 113) Fehler: 'Modify_Person' wurde nicht in diesem Bereich erklärt

Hier ist der Code:

#include <iostream> 
#include <string> 

using namespace std; 

void PassByByValue(int num2){ 

    cout << "You are in PassByValue()" << endl; 

    num2++; 

} 
class Person{ 
    int age; 
    string name; 
    int height; 
    int weight; 
public: 

    Person(){ 

    } 

    Person(string name){ 
     this->name=name; 
    } 

    string getName(){ 
    return this->name; 
    } 

    void setAge(int age){ 
    this->age=age; 
    } 


    void setName(string name){ 
    this->name=name; 
    } 

    void setHeight(int height){ 
    this->height=height; 
    } 

    void setWeight(int weight){ 
    this->weight=weight; 
    } 


    ~Person(){ 

    } 

}; 



string Person::Modify_Person(Person example){ 

    example.getName()="Jessica"; 

    return example.getName(); 
} 

void PassByRef(int& num3){ 

cout << "You are in PassByRef()" << endl; 

num3=50; 

cout << "inside PassByRef() pNum is: " <<num3<<endl; 

} 

int main() 
{ 
    int num1; 
    int* pNum; 

    num1=3; 
    *pNum=5; 

    PassByByValue(num1); 

    cout << "num1= " <<num1 <<endl; 

    PassByRef(*pNum); 

    cout << "outside PassByRef() in main() pNum is: " <<pNum<<endl; 

    PassByByValue(*pNum); 

    double* DblePtr; 

    DblePtr= new double; 

    *DblePtr=12.0; 

    cout<< "DblePtr: "<< &DblePtr; 

    delete[] DblePtr; 

    cout<< "DblePtr: "<< &DblePtr; 

    Person human; 
    human.setName("Kate"); 
    human.setAge(27); 
    human.setHeight(100); 
    human.setWeight(100); 

    Modify_Person(human); 

    cout << "Modify_Person returns: " << Modify_Person(human) <<endl; 

    cout << "name should be Jessica: " << human.getName() << endl; 

    return 0; 
} 
+0

Sie sollten auf Scoping Regeln nachlesen. Dies könnte ein guter Anfang sein: http://en.cppreference.com/w/cpp/language/scope – TallChuck

+5

Compiler ist tot rechts. Nirgends in 'Person' ist eine' Modify_Person'-Methode deklariert. Außerhalb 'Person', yep. Direkt darunter.Etwas zu spät, leider. – user4581301

+0

Danke @TallChuck und @ user4581301! –

Antwort

2

Sie können nicht erklären ein Mitglied r Funktion außerhalb einer Klasse in C++. Um dies zu beheben, fügen Sie eine entsprechende Elementfunktion Deklaration Ihrer Klasse:

class Person{ 
... 
public: 
string Modify_Person(Person); 
}; 

Dann wird Ihr Code arbeiten. Auch ein Vorschlag: Konstruktoren und Destruktoren nicht definieren, wenn sie leer sind; Erlauben Sie dem Compiler, sie für Sie zu generieren. Wenn Sie beabsichtigen, Bewegungskonstruktoren usw. zu deaktivieren, indem Sie das tun, schreiben Sie Person() = default;, damit der Compiler eine Standardimplementierung generiert.

+0

Das hat funktioniert! Danke @DeepCoder! –

1

Die Funktion

string Person::Modify_Person(Person example) { 

    example.getName()="Jessica"; 

    return example.getName(); 
} 

hat die folgenden Probleme.

  1. Verwendung von string Person::Modify_Person(Person example) { ... } eine Funktion zu definieren, ist nur gültig, von Modify_Person als Mitglied Funktion der Klasse deklariert wird. Da ist es nicht, Sie brauchen nur eine globale Funktion.

    string Modify_Person(Person example) { 
    ... 
    } 
    
  2. Die Funktion das Objekt in den Anruffunktionen nicht ändern kann, da das Argument von Wert übergeben wird. Unabhängig davon, was Sie an example tun, bleibt der Wert des Objekts, das zum Aufrufen der Funktion verwendet wurde, in der aufrufenden Funktion unverändert. Wenn Sie sehen möchten, dass Änderungen an example in der aufrufenden Funktion sichtbar sind, müssen Sie das Argument als Referenz akzeptieren.

    //       | 
    //       v 
    string Modify_Person(Person& example) { 
    ... 
    } 
    
  3. Die Linie

    example.getName()="Jessica"; 
    

    in der Funktion verändert nicht den Namen example. Es ist äquivalent zu der Aussage:

    string temp = example.getName(); 
    temp = "Jessica"; 
    

    Daher ist die Linie unter dem Namen von example gibt einfach den Namen example zurückzukehren, und nicht "Jessica", die ich glaube, ist entgegen Ihrer Erwartung.

    example.setName("Jessica"); 
    

Hier ist, was die Funktion sollte wie folgt aussehen:

Diese Zeile geändert werden muss

string Modify_Person(Person& example) { 
    example.setName("Jessica"); 
    return example.getName(); 
} 
Verwandte Themen