Я делаю программу функций freind в соответствии с этой книгой, которую я имею, и я сделал немного своего кода в программе. Я головоломка, потому что я получаю сообщение об ошибке, что "room_num" не объявлен, а идентификатор intellisense "room_num" не определен. Мне нужна помощь в понимании, почему это происходит и как это исправить. Вот код, над которым я работал в течение трех недель.
#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
class HotelRoom
{
friend int Transfer( HotelRoom&, int);
private:
int room_num;
int transroom_num;
int room_cap;
int occup_stat;
double daily_rt;
public:
HotelRoom(int room, int roomcap, int occup, int transroom, double rate = 89.00);
~HotelRoom();
int Display_Number(); //Displays room number and add the method Display_Guest()
int Get_Capacity();
int Get_Status();
double Get_Rate();
int Change_Status(int);
double Change_Rate(double);
void Display_Guest();
};
HotelRoom::~HotelRoom()
{
cout << endl<<endl;
cout << "Guest in room "<<room_num << " has checked out." <<endl;
}
int HotelRoom::Display_Number()
{
return room_num;
}
int HotelRoom::Get_Capacity()
{
return room_cap;
}
int HotelRoom::Get_Status()
{
return occup_stat;
}
int HotelRoom::Change_Status(int occup)
{
occup_stat = occup;
if (occup > room_cap)
{
return -1;
}
else
return occup_stat;
}
double HotelRoom::Get_Rate()
{
return daily_rt;
}
double HotelRoom::Change_Rate(double rate)
{
daily_rt = rate;
return daily_rt;
}
int Transfer(HotelRoom& room_r1, int transroom)
{
//if guest transfers to different hotel room, room is vacant and transroom is now occupied
room_r1.room_num = room_r1.transroom_num;
return room_num;
}
int main()
{
cout<< setprecision(2)
<<setiosflags(ios::fixed)
<<setiosflags(ios::showpoint);
int room = 0;
int roomcap = 4;
int transroom;
int occup;
double rate = 89.00;
cout<<"\nEnter the room number: "<<endl;
cin>>room;
cout<<"\nEnter the amount of guest to occupy this room: "<<endl;
cin>>occup;
cout<<"\nThe guest has decided to transfer rooms"<<endl;
cout<<"\nEnter the room to transfer the guest to"<<endl;
cin>>transroom;
HotelRoom room1(room,roomcap, occup, transroom, rate ); //initialize the object
if (room1.Change_Status(occup) == -1)
{
cout<<"You have exceeded the room capacity"<<endl;
}
else
{
cout <<"\nThe room number is ";
room1.Display_Number();
cout<<"."<<endl;
cout<<"\nThe name of the primary guest is ";
room1.Display_Guest();
cout <<"."<<endl;
cout<<"\nThe number of guest in the room is "<<room1.Change_Status(occup)<<"." <<endl;
cout<<"\nThe daily rate for room "<<room<< " is "<<room1.Get_Rate()<<"."<<endl<<endl;
cout<<"\nYou have tranferred the guest from room"<<room1.Display_Number()<<"to" <<Transfer(room1,transroom)<<endl;
}
cout<<"\nRoom ";
room1.Display_Number();
cout<<" is vacant."<<endl;
system("PAUSE");
return 0;
}
Поскольку вы новичок, я просто буду придерживаться функций-членов и частных переменных класса, пока вы не улучшаетесь.
Что касается сообщения об ошибке, я предполагаю, что внутри функции, которой вы пользуетесь room_num, нет доступа к частным частям класса HotelRoom. Заметьте, я сказал, предположим, что, потому что вы должны скопировать и вставить текст в окне вывода здесь, чтобы мы могли видеть, что именно происходит.
Во-первых, вы должны определить, что room_num
является переменной-членом класса.
int Transfer(HotelRoom& room_r1, int transroom)
{
room_r1.room_num = room_r1.transroom_num;
//because room_num is not non class member variable, you have to write like below.
return room_r1.room_num;
//return room_num;
}
Во-вторых, вы не HotelRoom::HotelRoom(int,int,int,int,double)
определение HotelRoom::HotelRoom(int,int,int,int,double)
, HotelRoom::Display_Guest(void)
. Поэтому вам нужно написать этот конструктор и функцию, чтобы избежать ошибки LNK2019.
Функция Transfer
не является методом HotelRoom
, но вы пытаетесь получить доступ к room_num
в нем, как если бы это было так. Вам нужно указать, в каком room_num
HotelRoom
вы HotelRoom
экземпляр HotelRoom
. Вероятно, вы имели в виду return room_r1.room_num
вместо return room_num
.
Также в вашей функции Transfer
вы никогда не используете параметр transroom
, вместо этого вы используете transroom_num
из room_r1
. Это, вероятно, не то, что вы хотите.
Наконец, вы не реализовали конструктор и DisplayRoom
of HotelRoom
. Вы должны создать заглушки, которые ничего не делают или не печатают предупреждения, если вы не правильно применяли эти методы, поэтому вы можете, по крайней мере, скомпилировать и связать код.