Как ввести функцию-член в область видимости?

Итак, я вызываю функцию, которая принимает входные данные как предел i и массив объектов h.

#include<iostream>
#include<vector>
using namespace std;
class hotel
{
private:
    string name,add;
    char grade;
    int charge,no;
public:
    void getdata();
    void putdata();
    void grade_print(int,hotel[]);
    void room_charge();
    void top2();
};
void hotel::getdata()
{
    cout<<"Add Name: ";
    getline(cin>>ws,name);
    cout<<"Add Addres: ";
    getline(cin>>ws,add);
    cout<<"Enter grade,room charge and no. of rooms: ";
    cin>>grade>>charge>>no;
}
void hotel::putdata()
{
    cout<<name<<endl<<add<<endl<<grade<<endl<<charge<<endl<<no;
}
void hotel::grade_print(int num,hotel h[])
{
    int i,j,k; char val;
    for(i=0;i<num;i++)
    {
        val=h[i].grade;
        for(j=0;j<num;j++)
        {
            if(h[j].grade==val)
            {
                cout<<h[j].grade<<endl;
                h[j].grade=' ';
            }
        }
    }

}
int main()
{
    std::vector <hotel> h(1);
    int i=0,j;
    cout<<"Want to add hotel? Press 1: ";
    cin>>j;
    while(j==1)
    {
        h[i].getdata();
        h.resize(2);
        i++;
        cout<<"Want to add more? Press 1 for yes, 0 for no: ";
        cin>>j;
    }
    grade_print(i,h);
}

ошибка здесь показывает, чтоgrade_print выходит за рамки. Также класс является закрытым членом, но вызывается функцией-членом. Так почему он показывает, что класс не может быть назван. Скажите, пожалуйста, почему так и что я могу сделать, чтобы это исправить? Edit1: объявление функции как static void не помогает, поскольку компилятор показывает, что функция не может быть объявлена ​​как static void.

D:\C++ Programs\testfile.cpp|30|error: cannot declare member function 'static void hotel::grade_print(int, hotel*)' to have static linkage [-fpermissive]|

person Community    schedule 21.01.2018    source источник
comment
grade_print(i,h); вам нужен объект. Возможно, hotel::grade_print() должна быть статической или бесплатной функцией.   -  person drescherjm    schedule 21.01.2018
comment
Возможный дубликат Невозможно вызвать функцию-член без объекта = C++   -  person user7860670    schedule 21.01.2018
comment
объявить static void не помогает, поскольку компилятор показывает, что функция не может быть объявлена ​​как static void   -  person    schedule 21.01.2018
comment
Вау, все эти endl: этот поток абсолютно, положительно, бесспорно очищен. Большинство или все из них следует заменить на '\n'; который заканчивает строку, без лишнего материала.   -  person Pete Becker    schedule 21.01.2018
comment
@PeteBecker спасибо за предложение. Будет делать так   -  person    schedule 21.01.2018


Ответы (2)


Насколько я понимаю, grade_print выводит информацию о группе отелей, переданных в качестве параметра. Если у вас есть функция, которая воздействует на группу определенного класса, эта функция не должна быть членом этого класса. Вместо этого это должна быть просто функция, не связанная с каким-либо классом. Это также устраняет вашу проблему с областью действия, поскольку тогда она будет иметь глобальную область действия.

Если мой аргумент кажется странным, подумайте об этом так. Допустим, у меня есть класс с именем number, а также функция с именем print_nums, которая печатает переданный ей массив numbers. Сделал бы я print_nums глобальной функцией или членом класса number? Первый, да? Второй, хотя и сработает, просто не имеет смысла.

person paper man    schedule 21.01.2018

grade_print(i, h);

Нестатическую функцию-член следует вызывать для определенного объекта, например:

h[i].grade_print(i, h);

Но в вашем случаеgrade_print должен быть статическим, поэтому он должен быть объявлен следующим образом:

static void grade_print(int,hotel []);

И определение идет нормально. Кроме того, после того, как вы сделаетеgrade_print статическим, вы должны вызывать его следующим образом:

hotel::grade_print(i, h);
person Se7eN    schedule 21.01.2018