Возникли проблемы с объектами и классами в C ++ - PullRequest
0 голосов
/ 07 января 2020

Итак, я определил метод displayStudInfo в классе Student и вызвал его в основной функции. Но я получаю сообщение об ошибке «Функция не объявлена ​​в этой области». Может кто-нибудь сказать мне, почему это происходит и что я могу сделать, чтобы решить эту проблему?

#include <iostream>
#include <string>
using namespace std;


class Student{

  public:
    int age;
    string name;


    void enterInfo(){

    cout << "Enter your age = " ; cin >> age;
    cout << "Enter your name = "; cin >> name;

    }


    void displayStudInfo(Student s)
    {
        cout << "Age = " << s.age << ", name=" << s.name << endl;
    }

};




int main(){

    int size;
    Student stud[100];
    Student abir;

    abir.enterInfo();
    displayStudInfo(abir);

}

Ответы [ 3 ]

3 голосов
/ 07 января 2020

void displayStudInfo(Student s) скрыто в боковом классе. Таким образом, он недоступен в main ().

Попробуйте:

 void displayStudInfo()
    {
        cout << "Age = " << age << ", name=" << name << endl;
    }

вызов в main ():

abir.displayStudInfo();
3 голосов
/ 07 января 2020

В вашем случае void displayStudInfo(Student s) является функцией-членом Student, поэтому вы должны вызывать ее для экземпляра Student, так же, как вы делали с enterInfo.

. это по-разному. Один из способов - сделать функцию-член свободной функцией, переместив ее из тела Student

class Student{

  public:
    // … 
};

void displayStudInfo(Student s)
{
  cout << "Age = " << s.age << ", name=" << s.name << endl;
}

int main(){
    // … 

    displayStudInfo(abir);

}

displayStudInfo, на самом деле хороший кандидат на свободную функцию. Или вы делаете его static, который похож на бесплатную функцию, и получаете доступ к функции-члену stati c, используя Student::displayStudInfo(abir).

Другим способом было бы вызвать displayStudInfo на abir, в этом случае вам не нужен аргумент Student, так как abir неявно передается displayStudInfo.

class Student{

  public:
    // … 

    void displayStudInfo()
    {
      cout << "Age = " << age << ", name=" << name << endl;
    }

};

int main(){
    // … 

    abir.displayStudInfo();
}

0 голосов
/ 07 января 2020

В C ++ все функции-члены неявно получают параметр, который указывает на текущий объект. Этот параметр является this указателем .

. Поэтому не имеет смысла указывать дополнительный (явный) параметр для объекта в вашем определении функции displayStudInfo.

Имеет смысл переписать определение функции на

void displayStudInfo()
{
    cout << "Age = " << age << ", name=" << name << endl;
}

и вызвать его с помощью

abir.displayStudInfo();

вместо

displayStudInfo(abir);

В качестве альтернативы, вы можете сделать функцию displayStudInfo не являющейся членом, поместив ее вне объявления класса Student. В этом случае вам придется сохранить явный параметр, поскольку этот параметр неявно передается только функциям-членам.

...