2013-11-23 3 views
2

Итак, у меня есть задание для класса, для которого требуется, чтобы мы использовали ряд классов вместе, чтобы имитировать сотрудника полиции, выдавшего билет.Создание класса для создания другого класса?

Вот как это работает:

класс

ParkedCar:

Чтобы узнать, автомобили делают, модель, цвет, номер лицензии, а также количество минут , что автомобиль был припаркован

ParkingMeter Класс:

знаю, сколько времени было приобретено

ParkingTicket Класс:

знает делает, модель, цвет, лицензию автомобиля, рассчитать штраф, а также имя и значок номер сотрудника, выдавшего билет

PoliceOfficer Класс:

Знать имя значка номер сотрудника

и

Изучение ParkedCar и ParkingMeter объектов и определить, является ли билет необходим, если да, то сгенерировать объект ParkingTicket.

Вот что код, который я до сих пор:

#include<iostream> 
#include<cstdlib> 
#include<cstring> 
#include<ctime> 

using namespace std; 

class ParkedCar 
{ 
    string sMake; 
    string sModel; 
    string sColor; 
    string sPlate; 
    int iMinsParked; 

    public: 

    ParkedCar(); 

    string getMake() const 
    { return sMake; } 

    void setMake(string temp) 
    { sMake = temp; } 

    string getModel() const 
    { return sModel; } 

    void setModel(string temp) 
    { sModel = temp; } 

    string getColor() const 
    { return sColor; } 

    void setColor(string temp) 
    { sColor = temp; } 

    string getPlate() const 
    { return sPlate; } 

    void setPlate(string temp) 
    { sPlate = temp; } 

    int getMins() const 
    { return iMinsParked; } 

}; 

ParkedCar::ParkedCar() 
{ 


    srand(time(NULL)); 

    iMinsParked = (rand() % 10000); 
} 

class ParkingMeter 
{ 
    int iMinsPurch; 

    public: 

    void setMins(int temp) 
    { iMinsPurch = temp; } 

    int getMins() const 
    { return iMinsPurch; } 
} 

class Ticket : public ParkedCar 
{ 

    public: 

    string getName() 
    { return sName; } 

    int getBadge() 
    { return iBadge; } 
}; 

class Officer 
{ 
    string sName; 
    int iBadge; 

    public: 

    friend string Ticket::getName(); 
    //{ return sName; } 

    friend int Ticket::getBadge(); 
    //{ return iBadge; } 
}; 

int main() 
{ 
    ParkedCar Park; 

    cout << endl << endl; 

    cout << Park.getMins(); 

    cout << endl << endl; 
    return 0; 
} 

Где я запутался в основном на билетах и ​​офицерских классов. Назначение явно хочет, чтобы у Билета была своя собственная информация из всех других классов, но я не уверен, как передать эту информацию. Я попытался сделать его дочерним классом ParkedCar, но я просто получил ошибку нескольких определений. И я не могу заставить функции друга работать. Я пробовал их в обоих направлениях, и если я делаю их в Билете, это говорит мне, что Офицер не определен. И я действительно смущен тем, как должен писать код для офицера, создающего экземпляр Ticket, когда ничего еще не было инициализировано.

Итак:

  1. Как мне получить всю информацию в классе билет?

  2. Как я могу получить офицера для создания экземпляра Билета?

Обратите внимание, что это задание СТУДЕНТА, а не что-то профессиональное. Я просто хочу сделать то, что говорится в задании. Меня не интересуют способы «обойти» проблему, потому что это не то, что хочет проф.

Заранее благодарим за ваше время. : D

+0

Для 'Officer' для создания экземпляра' Ticket' ему нужен только метод с типом возврата 'Ticket'. Вместо 'int' или' string' или 'void', отметьте тип возврата как' Ticket', создайте метод и верните объект 'Ticket'. – nhgrif

+0

Ваше беспричинное чрезмерное использование мутаторов делает бедного ребенка Иисусом плачущим. Просто говорю. Эта информация должна быть передана конструктору. – cHao

ответ

2

Во-первых: научиться использовать конструкторы. Все это, что вы настраиваете ... оно неотъемлемо от личности автомобиля, или полицейского и т. Д. Оно должно было быть предоставлено, когда объект был построен. C++ - это не Java; отказаться от обработки классов, таких как Java-компоненты. : P

Во-вторых, билет не является парком. Он ассоциируется с автомобилем, но не один сам.Рассмотрю вместо:

class Ticket { 
    ParkedCar violator; 
    Officer issuer; 
    public: 
    Ticket(const Officer &cop, const ParkedCar &car) : 
     violator(car), issuer(cop) { 
    } 

    ParkedCar getCar() { return violator; } 
    Officer getOfficer() { return issuer; } 

    // Note, no mutators here! 
    // The biggest reason you had to have mutators, is that your construction 
    // was incomplete. 
    // The info associated with a Ticket should not be modified once the ticket 
    // is written. And since the constructor has all the info needed, there's no 
    // need to provide a way to modify them. 
}; 

Так кавалеру не нужно знать о потенциально сложных деталях автомобиля, или то, что информация на потребностях билетов. Он может просто передать себя и машину дизайнеру и надеяться, что он будет извлекать всю необходимую информацию. (В этом случае мы просто храним копии обоих предметов.)

class Officer { 
    std::string name; 
    int badge_number; 

    public: 
    Officer(const std::string& name, int badge) : name(name), badge_number(badge) { } 

    public std::string getName() { return name; } 
    public int getBadgeNumber() { return badge_number; } 

    Ticket writeTicketFor(const ParkedCar &violator) { 
     return Ticket(*this, violator); 
    } 
}; 
+0

Ну, профессор хочет вводить пользователя для всей информации о машине, поэтому я не могу аккуратно упаковать все это в конструктор, поэтому у меня так много мутаторов. Но я все еще не совсем понимаю, как реализовать свой код ... какой бы класс я это делал, я объявляю экземпляр класса, который еще не определен. Кроме того, поскольку информация о машине должна быть определена пользователем, я не понимаю, как я могу передать ее в Ticket, прежде чем какая-либо из этих данных будет инициализирована. –

+0

Автомобиль уже существует. Если бы это не так, полицейский не знал бы, что он был припаркован незаконно, и не было никакого билета, чтобы писать. : P Что касается пользовательского ввода для автомобиля, получите вход, а затем постройте автомобиль. – cHao

+0

Круглость - это немного проблема. Но это можно решить, сказав «class Ticket; class ParkedCar; 'в файле заголовка для класса' Officer'. C++ позволяет использовать неполные типы в объявлениях функций, а офицер не должен содержать объект любого типа, поэтому все должно быть хорошо после того, как код переместится в свои собственные .cpp-файлы. (В файле .cpp вы должны включить заголовки для этих классов.) – cHao

Смежные вопросы