eroare: nicio funcție membră declarată în clasă (Programare, C++, Clasa)

Dev178 a intrebat.

Continui să primesc următoarele erori din codul meu:

(linia 58) error: no ‘std::string Person::Modify_Person(Person)’ member function declared in class ‘Person’ In function ‘int main()’:

(linia 113) eroare: ‘Modify_Person’ nu a fost declarată în acest domeniu de aplicare

Iată codul:

#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;
}

Comentarii

  • Ar trebui să vă documentați cu privire la regulile de încadrare. Acesta ar putea fi un bun punct de plecare: ro.cppreference.com/w/cpp/language/scope –  > Por TallChuck.
  • Compilatorul are perfectă dreptate. Nicăieri în Person este un Modify_Person metodă declarată. În afara Person, , da. Chiar sub ea. Cam prea târziu, din păcate. –  > Por user4581301.
  • Mulțumesc @TallChuck și @user4581301! –  > Por Dev178.
2 răspunsuri
DeepCoder

Nu puteți declara o funcție membră în afara unei clase în C++. Pentru a rezolva acest lucru, adăugați o declarație de funcție membră corespunzătoare clasei dvs:

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

Apoi, codul dvs. va funcționa. De asemenea, o sugestie: nu definiți constructori și destructori dacă aceștia sunt goi; permiteți compilatorului să le genereze pentru dvs. Dacă intenționați să dezactivați constructorii de mișcare etc. făcând acest lucru, scrieți Person() = default; pentru ca compilatorul să genereze o implementare implicită.

R Sahu

Funcția

string Person::Modify_Person(Person example) {

   example.getName()="Jessica";

   return example.getName();
}

are următoarele probleme.

  1. Utilizarea lui string Person::Modify_Person(Person example) { ... } pentru a defini o funcție este valabilă numai în cazul în care Modify_Person este declarată ca o funcție membră a clasei. Deoarece nu este așa, aveți nevoie doar de o funcție globală.

    string Modify_Person(Person example) {
    ...
    }
    
  2. Funcția nu poate modifica obiectul din funcțiile apelante, deoarece argumentul este transmis prin valoare. Indiferent de ceea ce faceți pentru example, , valoarea obiectului care a fost utilizat pentru a apela funcția rămâne neschimbată în funcția apelantă. Dacă doriți să vedeți orice modificare efectuată în example să fie vizibile în funcția de apelare, trebuie să acceptați argumentul prin referință.

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

    example.getName()="Jessica";
    

    din funcție nu modifică numele lui example. Este echivalent cu a spune:

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

    Prin urmare, linia de mai jos care returnează numele lui example va returna pur și simplu numele lui example, , și nu "Jessica", , ceea ce cred că este contrar așteptărilor dumneavoastră.

    Această linie trebuie schimbată în:

    example.setName("Jessica");
    

Iată cum ar trebui să arate funcția:

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

Tags:,