Interface & Co.



  • Hallo miteinander.

    Ich habe eine Frage. In C++ gibt es ja keine Interfaces als solche. Wenn ich nun aber doch ein "interface" namens event.hpp implementieren muss, welches die Methode get_message() const:: std::string enthält, ist folgendes dann richtig?

    #ifndef EVENT_HPP
    #define EVENT_HPP
    
    class event 
    { 
    public: 
    std::string get_message() const;
    }; 
    
    #endif
    


  • Du musst die Funktion als virtual deklarieren, damit die Funktion polymorph korrekt aufgerufen wird. Ausserdem muss ans Ende der Funktion noch ein = 0, so dass sie abstrakt ist. Damit wird die ganze Klasse abstrakt.
    Das ganze sieht dann so aus:

    #ifndef EVENT_HPP 
    #define EVENT_HPP 
    
    class event 
    { 
    public: 
    virtual std::string get_message() const = 0; 
    }; 
    
    #endif
    


  • Ahhh okey.
    Besten Dank!

    Ich habe noch zwei Fragen zu zwei Funktionen.
    Hier erst Mal das hpp-file zur Klasse:

    #ifndef ELEVATOR_HPP
    #define ELEVATOR_HPP
    
    #include <vector>
    #include "event.hpp"
    #include "passenger.hpp"
    #include "passenger_queue.hpp"
    
    #define MAX_PASSENGERS 5
    
    enum direction
    {
    	DOWN = -1,
    	NONE = 0,
    	UP = 1
    };
    
    class elevator
    {
    public:
    	elevator(passenger_queue*);
    
    	void handle_event(const event*);
    
    	void add_passenger(const passenger*);
    	void serve_next_request();
    	int get_current_floor() const;
    
    	int max_floors() const;
        bool is_empty() const;
    
    	void move_to(int floor);
    
    private:
    	std::vector<const passenger*> _passengers;
    	int _current_floor;
    	direction _direction;
    
    	passenger_queue* _queue;
    };
    
    #endif
    

    Und hier das cpp-file:

    #include <iostream>
    #include "elevator.hpp"
    #include "stop_event.hpp"
    
    elevator::elevator(passenger_queue* queue_) : _current_floor(2), _direction(UP), _queue(queue_)
    {}
    
    void elevator::handle_event(const event* e_)
    {
    	std::cout << e_->get_message() << std::endl;
    
    	// Hier fehlt mir noch Code. 
             /* Die Beschreibung hierzu lautet: Implement the event handler in elevator.cpp for events of type stop event. The event occurs
    if the elevator stops. You will need to let passengers exit from the elevator and let the ones on the cur-
    rent 
    oor enter. Use the previously implemented method elevator::add passenger(const
    passenger*). Make sure that you catch the exception if the elevator is full. */
    
    }
    
    void elevator::add_passenger(const passenger* passenger_)
    {
    	if(!is_empty())
    	{
    		std::cerr << "Elevator is full." << std::endl;
    	}
    	else
    	{
    		elevator(*passenger_);
    	}
    }
    
    void elevator::serve_next_request()
    {
    	// Auch hier sollte noch etwas Code rein.
             /* Die Beschreibung lautet: Implement the method elevator::serve next request(). You will need to nd the next
    necessary stop in the current direction. If there are none, you might nd more requests if you change
    the elevator's direction. */
    
    }
    
    int elevator::get_current_floor() const
    {
    	return _current_floor;
    }
    
    void elevator::move_to(int floor_)
    {
        std::cout << "Moving to floor " << floor_ << std::endl;
    
        _current_floor = floor_;
    
        stop_event stop(floor_);
        handle_event(&stop);
    }
    
    int elevator::max_floors() const
    {
        return 10;
    }
    
    bool elevator::is_empty() const
    {
        return _passengers.size() == 0;
    }
    

    Die beiden Funktionen handle_event und serve_next_request() konnte ich auch nach längerem Probieren nicht hinbiegen. Wenn also jemand gerade sieht, wie man die beiden Funktionen implementieren könnte, wäre ich sehr froh, wenn es dieser jemand verraten würde, wie man denn das am ehesten hinkriegen könnte.. 🙂


Anmelden zum Antworten