简体   繁体   中英

C++ classes (composition and inheritance - header files, array of classes)

I have written 4 header files (of classes) of which 3 classes has been successfully compiled (Customer, GoldCustomer and PlatinumCustomer). GoldCustomer and PlatinumCustomer are derivation (inheritance) of Customer while the problematic MovieTicket class is a composition of all of the other 3 classes. This is to follow the requirement imposed : to show inheritance and composition.

Compiling MovieTicket gives me these errors. Can anyone help to examine and explain? It seems like there are repetition of declaration of the classes (but from what I read in Google, as long as you put include the classes in the header files and put the header guard, that error wouldnt come out). One other thing is, my array of classes gives errors...I have no idea why

In file included from class_GoldCustomer.hpp:3:0, from class_MovieTicket.hpp:5:
class_Customer.hpp:11:7: error: redefinition of ‘class Customer’

In file included from class_MovieTicket.hpp:4:0: 
class_Customer.hpp:11:7: error: previous definition of ‘class Customer’

In file included from class_PlatinumCustomer.hpp:3:0, 
from class_MovieTicket.hpp:6:  class_Customer.hpp:11:7: 
error: redefinition of ‘class Customer’

In file included from class_MovieTicket.hpp:4:0: class_Customer.hpp:11:7: 
error: previous definition of ‘class Customer’

class_MovieTicket.hpp:29:22: error: expected ‘]’ before ‘;’ token
class_MovieTicket.hpp:29:25: error: expected unqualified-id before ‘]’ token
class_MovieTicket.hpp:32:26: error: expected ‘]’ before ‘;’ token
class_MovieTicket.hpp:32:29: error: expected unqualified-id before ‘]’ token
class_MovieTicket.hpp: In member function 
‘void MovieTicket::newMovie(int, std::string,     std::string, int, int, float)’:
class_MovieTicket.hpp:53:3: error: ‘ListGold’ was not declared in this scope
class_MovieTicket.hpp:53:12: error: expected ‘]’ before ‘;’ token
class_MovieTicket.hpp:53:15: error: expected primary-expression before ‘]’ token
class_MovieTicket.hpp:53:15: error: expected ‘;’ before ‘]’ token
class_MovieTicket.hpp:54:3: error: ‘ListPlat’ was not declared in this scope
class_MovieTicket.hpp:54:12: error: expected ‘]’ before ‘;’ token
class_MovieTicket.hpp:54:15: error: expected primary-expression before ‘]’ token
class_MovieTicket.hpp:54:15: error: expected ‘;’ before ‘]’ token
class_MovieTicket.hpp: In member function ‘void MovieTicket::Purchase()’:
class_MovieTicket.hpp:103:4: error: ‘ListGold’ was not declared in this scope
class_MovieTicket.hpp:108:4: error: ‘ListPlat’ was not declared in this scope
Compilation failed.

Below are the codes:

class_Customer.hpp

#include <iostream>
#include <string>

//header guard
#ifndef CUSTOMER_H
#define CUSTOMER_H

using namespace std; 

class Customer {

protected:
//data members
int id;
string type;
int sold;

//public:
//constructor and destructor
Customer(){
    type = "non member"; //default this customer class as 'non member'
    sold = 0;
}
~Customer(){}

//functions member
void setID(int inputID){ //set ID of the customer
    id = inputID;
}

int getSold(){ //get no. of sold
    return sold;
}

};
#endif[/CODE]

class_GoldCustomer.hpp

#include <iostream>
#include <string>
#include "class_Customer.hpp"

using namespace std; 

//header guard
#ifndef GOLDCUSTOMER_H
#define GOLDCUSTOMER_H


class GoldMember : protected Customer{

private:
//data members
int gold_id;
int annual_fee;
float discount;

public:
//constructor and destructor
GoldMember(){
    type = "gold"; 
    sold = 0;
    annual_fee = 10;
    discount = 0.1;
}
~GoldMember(){}

//functions member
int getAnnualFee(){ //get annual fee
    return annual_fee;
}

float getDiscount(){ //get discount
    return discount;
}

};
#endif[/CODE]

class_PlatinumCustomer.hpp

#include <iostream>
#include <string>
#include "class_Customer.hpp"

#define POINT 5; //how many ticket purchased needed to eligible for one free ticket

using namespace std; 

//header guard
#ifndef PLATINUMCUSTOMER_H
#define PLATINUMCUSTOMER_H

class PlatinumMember : protected Customer{

private:
//data members
int plat_id;
int annual_fee;
float discount;
int redeem_point = 0; //count the tickets purchased as 'points'

public:
//constructor and destructor
PlatinumMember(){
    type = "gold"; 
    sold = 0;
    annual_fee = 50;
    discount = 0.2;
    redeem_point = 0;
}
~PlatinumMember(){}

//functions member
int getAnnualFee(){ //get annual fee
    return annual_fee;
}

float getDiscount(){ //get discount
    return discount;
}

int getFRedeemPoint(){ //get redeem point
    return redeem_point;
}

int getFreeTicket(){ //get no. of free tickets based on redeem point
    int result;
    result = redeem_point/POINT;
    return result;
}

};
#endif[/CODE]

Finally, failed to compile:

class_MovieTicket.hpp

#include <iostream>
#include <string>

#include "class_Customer.hpp"
#include "class_GoldCustomer.hpp"
#include "class_PlatinumCustomer.hpp"

//header guard
#ifndef MOVIETICKET_H
#define MOVIETICKET_H


using namespace std; 

#define MAX 20; //no of tickets per movie hall available

class MovieTicket {

private:
int movie_id;
string movie_title;
string date;
int hall_no;
int seat_no;
float ori_price;

int NonMemberCount;

GoldMember ListGold[MAX];
int GoldMemberCount;

PlatinumMember ListPlat[MAX];
int PlatMemberCount;

static int AvailTicket;
static int SoldTicket;

public:
//constructor and destructor
MovieTicket(){};
~MovieTicket(){};

//functions member
void newMovie(int inputMovieID, string inputTitle, 
 string inputDate, int inputHall,    int inputSeat, float inputPrice){

    movie_id = inputMovieID;
    movie_title = inputTitle;
    date = inputDate;
    hall_no = inputHall;
    seat_no = inputSeat;
    ori_price = inputPrice;

    ListGold[MAX] = {0};
    ListPlat[MAX] = {0};

    AvailTicket = MAX;
    SoldTicket = 0;
}

int getAvailTicket(){
    return AvailTicket;
}

int getSoldTicket(){
    return SoldTicket;
}

void Purchase(){
    int no_of_ticket;
    int membership;
    int Inputgold_id;
    int Inputplat_id;

    cout <<"Enter Movie ID?" << endl;
    cin >> movie_id;
    cout << endl << "How many ticket?" << endl;
    cin >> no_of_ticket;
    cout << endl << "Enter membership? 1. Non 2. Gold 3.Plat" << endl;
    cin >> membership;

    this->SoldTicket += no_of_ticket;
    this->AvailTicket = MAX - this->SoldTicket;


    if (membership == 2){
        cout << "Enter your Gold Membership ID?" << endl;
        cin >> Inputgold_id;
        GoldMember Inputgold_id; 
                     //create a Gold customer class with 'ID' as the name
    } 
    else if (membership == 3){
        cout << "Enter your Platinum Membership ID?" << endl;
        cin >> Inputplat_id;
        PlatinumMember Inputplat_id; 
                    //create a Plat customer class with 'ID' as the name
    }

    switch (membership){
        case 1:
        NonMemberCount++;
        break;

        case 2:
        GoldMemberCount++;
        ListGold[GoldMemberCount] = Inputgold_id;
        break;

        case 3:
        PlatMemberCount++;
        ListPlat[PlatMemberCount] = Inputplat_id;
        break;
    }
}
};
#endif[/CODE]

p/s: sorry for the long post.

What is your command line for compiling ? Do you give your header files to he compiler ? You should have a dummy main.cpp that includes everything and only compile main.cpp

You certainly shouldn't have a semicolon here: #define MAX 20;

This leads to PlatinumMember ListPlat[MAX]; expanding to PlatinumMember ListPlat[20;]; which is why the compiler moans.

There are a couple of other places with similar #define

I would suggest using 'const int MAX = 20; (preferrably max = 20`, as uppercase indicates macros).

At a quick glance, the other errors are simply consequences of the above error - compiler gets a bit lost when it's hitting strange stuff, and just continues without declaring variables, and then variables are missing later on.

Edit: By the way, in your "platinumMember.hpp", should this type = "gold"; not be type = "platinum"; ?

(Darn, too slow!)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM