brorez
brorez

Reputation: 1

Class Operations

I am a little hung on on completing this program

The assessment asks us Following the information provided below, implement a RockConcert and TicketHolder class. The class TicketHolder represents someone who paid for admission a particular concert. This TicketHolder class should keep track of the what it cost and where the seat located.

I have constructed most of the code, given the Driver that was provided, but I am pretty stumped with how to go about coding methods RockConcert::sellTicket and, RockConcert::getTicket

Below is the code,

Thanks a ton!

TicketHolder.h

#ifndef TicketHolder_h
#define TicketHolder_h
#include <string>
#include <iostream>

using namespace std;

class TicketHolder {

public:
    TicketHolder();
    TicketHolder( std::string seat, double cost );

    std::string getSeat() const;
    double getCost() const;

    friend std::ostream& operator<< (std::ostream& os, const TicketHolder & t);

private:
    std::string my_Seat;
    double my_Cost;
};

#endif

TicketHolder.cpp

#include "TicketHolder.h"


TicketHolder::TicketHolder(){

}
TicketHolder::TicketHolder( std::string seat, double cost ){
    my_Seat = seat;
    my_Cost = cost;
}

std::string TicketHolder::getSeat() const{
    return (my_Seat);
}

double TicketHolder::getCost() const{
    return (my_Cost);

}

std::ostream& operator<< (std::ostream& os, const TicketHolder & t){
    return os;
}

RockConcert.h

#ifndef RockConcert_h
#define RockConcert_h
#include <string>
#include <iostream>
#include <stdexcept>
#include "TicketHolder.h"
#include "SeatAlreadySold.h"
#include "SeatNotFound.h"

class RockConcert {

public:
    public:
    RockConcert( std::string date, std::string location );

    void sellTicket( std::string seat, double cost ) throw (SeatAlreadySold);
    TicketHolder getTicket( std::string seat ) throw (SeatNotFound);
    double getProceeds( );

    friend std::ostream& operator<< ( std::ostream& out, const RockConcert & r );


private:
        TicketHolder myTickets[ 20 ];
        int myNumberOfTicketsSeenSoFar;
        std::string my_When;
        std::string my_Where;

    };

#endif

RockConcert.cpp

    #include "RockConcert.h"
    #include "TicketHolder.h"

    RockConcert::RockConcert( std::string date, std::string location ) {
        my_When = date;
        my_Where = location;
    }

    void RockConcert::sellTicket( std::string seat, double cost ) throw (SeatAlreadySold){

    }

    TicketHolder RockConcert::getTicket( std::string seat ) throw(SeatNotFound) {


    }

    double RockConcert::getProceeds( ){
        return (myNumberOfTicketsSeenSoFar);

    }

    std::ostream& operator<< ( std::ostream& out, const RockConcert & r ){
        return out;
    }

Driver.CPP

// driver
// function main
#include "TicketHolder.h"
#include "RockConcert.h"
#include <iostream>
#include <stdexcept>

int main(int argc, const char * argv[])

{
RockConcert megaDeath( "Sept 1", "Staples Center" );
megaDeath.sellTicket( "Row Q Seat 20", 120.00 );
megaDeath.sellTicket( "Row Q Seat 21", 120.00 );
megaDeath.sellTicket( "Row SSS Seat 12", 50.00 );
TicketHolder ticket = megaDeath.getTicket( "Row Q Seat 21" );

// Print out the concert and its tickets
std::cout << megaDeath << std::endl;


try {


    megaDeath.sellTicket( "Row T Seat 30", 65.00 );

} catch( SeatAlreadySold sas ) {

    std::cout << "An error occurred here for the reason:";
    std::cout << sas.what(std::endl:endl;
}

// Print out the library and its book - notice the difference
std::cout << megaDeath << std::endl;
// Let's try to throw some errors...
try {
    // can't sell a ticket that has already been sold
    megaDeath.sellTicket( "Row Q Seat 21", 120.00 );
    std::cout << "An error occurred here..." ;
} catch( SeatAlreadySold sas ) {
    sas.what();
}

try {
    // can't get a ticket that has not been sold
    megaDeath.getTicket( "Row A Seat 1" );
    std::cout << "An error occurred here..." ;
} catch( SeatNotFound snf ) {
    snf.what();
}

}

Upvotes: 0

Views: 193

Answers (1)

Tristan Brindle
Tristan Brindle

Reputation: 16834

I'm not sure exactly what the question is here, but I would be inclined to create a std::map mapping a ticket ID (which could jsut be a string like "Row ## Seat ##", as long as you're consistent) to a TicketHolder instance. Your TicketHolder class (which I think would be better named just Ticket) should include a boolean "sold" property.

In your getTicket() method, a simple lookup in the std::map would be fine, and very fast.

Your sellTicket() method should first call getTicket(), then check the "sold" property of the returned ticket (throwing an exception if it's already sold). If not, then set TicketHolder::sold = true. You should also add the ticket cost to a running total of the proceeds so far.

Other general rules that might be useful:

  • Use initialisation lists in constructors when you can
  • Avoid exception specifiers in C++, they probably don't do what you think
  • Unless you really know what you're doing, always throw exceptions by value, and catch by const reference.
  • Avoid copying std::strings and other complex objects in your function arguments
  • Likewise, think carefully about when your method return types should be copies, when they should be references, when they should be const references, and when they should be (smart) pointers.

Upvotes: 1

Related Questions