Как да вкарам членска функция в обхват?

Така че извиквам функция, която приема входни данни като limit 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 е извън обхвата. Също така оценката е частен член, но се извиква от функция член. Така че защо показва, че оценката не може да бъде извикана. Моля, кажете ми защо е така и какво мога да направя, за да го поправя? Редактиране1: Декларирането на функцията като 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
declare static void не помага, тъй като компилаторът показва, че функцията не може да бъде декларирана като static void   -  person    schedule 21.01.2018
comment
Уау, всички тези endls: този поток е абсолютно, положително, безспорно зачервен. Повечето или всички от тях трябва да бъдат заменени с '\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