0

私は現在、多重継承を学習していて、以前の祖先の変数と関数を継承する関数を作成する際に問題が発生しました。この問題は、複数の継承を行うshowRoomServiceMeal()関数で発生します。コンパイルすると、対応する継承された変数は保護されているため継承できず、継承された関数はオブジェクトなしで使用されているというエラーが表示されます。

保護されたアセッサーは、変数をその子が使用できるようにし、対応する関数と保護された変数にアクセスするために、スコープ解決演算子(::)を使用できると思いましたか?誰かがこれらのエラーが発生する理由を説明するのを手伝ってもらえますか?

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

class RestaurantMeal
{
protected:
    string entree;
    int price;
public:
    RestaurantMeal(string , int );
    void showRestaurantMeal();
};

RestaurantMeal::RestaurantMeal(string meal, int pr)
{
    entree = meal;
    price = pr;
}

void RestaurantMeal::showRestaurantMeal()
{
    cout<<entree<<" $"<<price<<endl;
}

class HotelService
{
protected:
    string service;
    double serviceFee;
    int roomNumber;
public:
    HotelService(string, double, int);
    void showHotelService();
};

HotelService::HotelService(string serv, double fee, int rm) 
{
    service = serv;
    serviceFee = fee;
    roomNumber = rm;
}

void HotelService::showHotelService()
{
    cout<<service<<" service fee $"<<serviceFee<<
    " to room #"<<roomNumber<<endl;
}

class RoomServiceMeal : public RestaurantMeal, public HotelService
{
public:
    RoomServiceMeal(string , double , int );
    void showRoomServiceMeal();
};

RoomServiceMeal::RoomServiceMeal(string entree, double price, int roomNum) : 
RestaurantMeal(entree, price), HotelService("room service", 4.00, roomNum)
{
}

void showRoomServiceMeal()
{
    double total = RestaurantMeal::price + HotelService::serviceFee;
    RestaurantMeal::showRestaurantMeal();
    HotelService::showHotelService();
    cout<<"Total is $"<<total<<endl;
}


int main()
{
    RoomServiceMeal rs("steak dinner",199.99, 1202);
    cout<<"Room service ordering now:"<<endl;
    rs.showRoomServiceMeal();
    return 0;
}

g ++を使用すると、次のエラーが発生します。

RoomService.cpp: In function ‘void showRoomServiceMeal()’:
RoomService.cpp:18: error: ‘int RestaurantMeal::price’ is protected
RoomService.cpp:73: error: within this context
RoomService.cpp:18: error: invalid use of non-static data member ‘RestaurantMeal::price’
RoomService.cpp:73: error: from this location
RoomService.cpp:39: error: ‘double HotelService::serviceFee’ is protected
RoomService.cpp:73: error: within this context
RoomService.cpp:39: error: invalid use of non-static data member ‘HotelService::serviceFee’
RoomService.cpp:73: error: from this location
RoomService.cpp:74: error: cannot call member function ‘void RestaurantMeal::showRestaurantMeal()’ without object
RoomService.cpp:75: error: cannot call member function ‘void HotelService::showHotelService()’ without object
4

2 に答える 2

1

関数をクラスshowRoomServiceMealの一部として定義しません。RoomServiceMeal

void showRoomServiceMeal()
{
    ...
}

への変更

void RoomServiceMeal::showRoomServiceMeal()
{
    ...
}

また、このshowRoomServiceMealメソッドでは、親クラスのメンバーにアクセスするときにクラスプレフィックスを使用する必要はありません。たとえばを使用する代わりに、を使用RestaurantMeal::priceすることができますprice。これは、変数と関数が各クラスで一意であるためです。

于 2012-08-23T06:35:07.240 に答える
0

RoomServiceMeal :: showRoomServiceMeal()の前を忘れました(コンパイラに関数が静的でクラスに関連していないと思わせる)

于 2012-08-23T06:34:03.863 に答える