Создание Класса Методом Getdescription ()

Тема в разделе "C/C++/C#", создана пользователем Tiina, 22 ноя 2011.

  1. Tiina

    Tiina Гость

    Уважаемые форумчане,
    Помогите девушке написать программу.
    Условия:

    У нас есть три вида транспортных средств: автомобили, тракторы и мопеды. У каждого типа есть свои номер (1=CAR, 2=TRACTOR, 3=MOPED, ...). Создать иерархию классов, в которой представлено каждое транспортное средство.

    Каждый автомобиль имеет двигатель и колеса: У автомобиля и трактора четыре колеса и четырехцилиндровый двигатель, у мопеда одноцилиндровый двигатель и два колеса. При создании транспортного средства следует также создать и его компоненты.

    Создайте классам транспортных средств метод GetDescription (), который должен выдавать для каждого типа транспортного средства его характеристики и список частей.

    Создайте класс в котором статическим методом можно создавать предварительно обозначенный тип транспортного средства. Класс следит шаблоном завода (Factory Pattern, Factory Method Pattern)

    Пример класса:

    class ShapeFactory {
    public:
    static Shape *create(int type) {
    switch (type) {
    case CIRCLE:
    return new Circle;

    case TRIANGLE:
    return new Triangle;

    ...

    default:
    return NULL;
    }
    }

    Подсказка: У каждого класса транспортных средств должен иметь общий базовый класс (Shape пример кода).

    В стране, где транспортные средства производятся, имеется автомобильный налог. Создайте метод для расчета налога, если известно, что он состоит из платы "выбросов" и "дорожного налога":

    а) каждый цилиндр должен нести 15 единиц загрязнения.
    b') владельцы мопедов освобождаются от уплаты за "выбросы".
    в) если у транспортного средства более чем 2 колеса, то за каждое следующее колесо должны платить 7 единиц дорожного налога.
    c) для тракторов дорожный налог в два раза больше.

    В тестовой программе создать vector из 33 автомобилей и рассчитать общее налоговое бремя. Допустим, что при этом типы транспортных средств разные.

    Классы разместить в модулях. В программе не должны быть "видемых" классов Car, Tractor, Engine и так далее. Иерархия классов в базовом классе (транспортное средство) должен быть виден. Создание модулей обязателен.

    d) фабричный метод не должен возвращать НУЛЛ значение (как в примере класса ShapeFactory). Когда завод получает параметр неизвестного типа, кодировать дефектный ответ специальным классом, при котором методы не должны ничего делать (Null Pattern Object).
    е) элементы автомобиля, чтобы быть "элегантной", то есть. Например, должно быть легко создать. 6-цилиндровый двигатель или трехколесные мопеды - или транспортные средства у которых плата "выбросов" и "дорожный налог" разные в зависимости от задачи.
    f) обеспечить возможность в дополнение к отечественному производству автомобилей -Китайский завод. Китайский завод для получения налоговых скидок производят трехколесный трактор и двухцилиндровые автомобили.
    h) при создании транспортного средства, необходимо сначала найти подходящий завод (отечественные заводы, китайские заводы), а затем каждый завод отвечает за создание корректного автомобиля. Используйте абстрактный шаблон завода (Factory Pattern, Factory Method Pattern).
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    В чем проблема? Всегда рады:blush:
     
  3. Tiina

    Tiina Гость

    Привет lazybiz,
    1) Создайте классам транспортных средств метод GetDescription (), который должен выдавать для каждого типа транспортного средства его характеристики и список частей. - Правильно ли я сделала? Или надо как-нибудь через "Private" для каждого класса отдельно?
    2) Подсказка: У каждого класса транспортных средств должен иметь общий базовый класс (Shape пример кода).-Что-то я ничего не нашла по поводу "ShapeFactory", поэтому сделала просто через Factory или они имеют ввиду создание общего класса "Shape"- Посоветуй как нужно сделать.
    У меня код пока такой:

    Код (C++):
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <vector>
    #include <iostream>
    #include <conio.h>

    using namespace std;

    class Vehicle{
    public:
    int type;
    virtual void getDescription()=0;
    };

    class Car:
    public Vehicle{
    public:
    void getDescription()
    {cout << "Car: 4-wheels and 4-cylinder engine" << endl;};
    public:
    Car()
    {type=1;};
    };

    class Tractor:
    public Vehicle{
    void getDescription()
    {cout << "Tractor: 4-wheels and 4-cylinder engine" << endl;};
    public:
    Tractor()
    {type=2;};
    };

    class Moped:
    public Vehicle{
    void getDescription()
    {cout << "Moped: 2-wheels and 1-cylinder engine" << endl;};
    public:
    Moped()
    {type=3;}
    };

    class Factory{
    public:
    static Vehicle * create(int type) {
    static Car *CarInstance;
    static Tractor *TractorInstance;
    static Moped *MopedInstance;
    switch (type) {
    case 1:
    CarInstance=new Car();
    return CarInstance;
    case 2:
    TractorInstance=new Tractor();
    return TractorInstance;
    case 3:
    MopedInstance=new Moped();
    return MopedInstance;
    default:
    return 0;
    }
    }
    };

    int main(){
    vector<Vehicle*> pccomponents;
    pccomponents.push_back(Factory::create(1));
    pccomponents.push_back(Factory::create(2));
    pccomponents.push_back(Factory::create(3));

    for(int i = 0; i<3; i++)
    pccomponents->getDescription();

    getch();
    }
    Код (C++):
     
    Добавлено:
    Привет lazybiz,
    1) Создайте классам транспортных средств метод GetDescription (), который должен выдавать для каждого типа транспортного средства его характеристики и список частей. - Правильно ли я сделала? Или надо как-нибудь через "Private" для каждого класса отдельно?
    2) Подсказка: У каждого класса транспортных средств должен иметь общий базовый класс (Shape пример кода).-Что-то я ничего не нашла по поводу "ShapeFactory", поэтому сделала просто через Factory или они имеют ввиду создание общего класса "Shape"- Посоветуй как нужно сделать.
    У меня код пока такой:

    Код (C++):
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <vector>
    #include <iostream>
    #include <conio.h>

    using namespace std;

    class Vehicle{
    public:
    int type;
    virtual void getDescription()=0;
    };

    class Car:
    public Vehicle{
    public:
    void getDescription()
    {cout << "Car: 4-wheels and 4-cylinder engine" << endl;};
    public:
    Car()
    {type=1;};
    };

    class Tractor:
    public Vehicle{
    void getDescription()
    {cout << "Tractor: 4-wheels and 4-cylinder engine" << endl;};
    public:
    Tractor()
    {type=2;};
    };

    class Moped:
    public Vehicle{
    void getDescription()
    {cout << "Moped: 2-wheels and 1-cylinder engine" << endl;};
    public:
    Moped()
    {type=3;}
    };

    class Factory{
    public:
    static Vehicle * create(int type) {
    static Car *CarInstance;
    static Tractor *TractorInstance;
    static Moped *MopedInstance;
    switch (type) {
    case 1:
    CarInstance=new Car();
    return CarInstance;
    case 2:
    TractorInstance=new Tractor();
    return TractorInstance;
    case 3:
    MopedInstance=new Moped();
    return MopedInstance;
    default:
    return 0;
    }
    }
    };

    int main(){
    vector<Vehicle*> pccomponents;
    pccomponents.push_back(Factory::create(1));
    pccomponents.push_back(Factory::create(2));
    pccomponents.push_back(Factory::create(3));

    for(int i = 0; i<3; i++)
    pccomponents->getDescription();

    getch();
    }
    Код (C++):
     
     
  4. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Что не получается? В двух словах, а не тремя абзацами.
    Задание пересказывать не надо, просто объясни что у тебя не получается.
     
  5. Tiina

    Tiina Гость

    Я не уверена, что я правильно создала "компоненты" транспортных средств и как мне использавать пример с Shape?
     
  6. igrok

    igrok Гость

    Скажите, пожалуйста, правильно ли у меня реализован шаблон Фабричный метод.

    Код (C++):
    class Vehicle {
    protected:
    int engine, wheels, pollut_rate, whl_tax_rate, vehicle_tax;
    public:
    Vehicle(int engn=1, int whls=2, int pltn_rt=0, int whl_tx_rt=0);
    virtual void GetDescription() = 0;
    virtual int GetPollutTax() = 0;
    int GetVehicleTax();
    int GetTax();
    };

    class Car: public Vehicle {
    public:
    Car(int engn=CAR_TRAC_ENGN, int whls=CAR_TRAC_WHLS, int pltn_rt=CYL_POL_RATE, int whl_tx_rt=WHEEL_TAX_RATE);
    void GetDescription();
    int GetPollutTax();
    };

    class Tractor: public Vehicle {
    public:
    Tractor(int engn=CAR_TRAC_ENGN, int whls=CAR_TRAC_WHLS, int pltn_rt=CYL_POL_RATE, int whl_tx_rt=WHEEL_TAX_RATE);
    void GetDescription();
    int GetPollutTax();
    };

    class Moped: public Vehicle {
    public:
    Moped(int engn=MOPED_ENGN, int whls=MOPED_WHLS, int pltn_rt=MPD_POL_RATE, int whl_tx_rt=0);
    void GetDescription();
    int GetPollutTax();
    };

    //NullVehicle is a vehicle whose type is neither a Car, nor a Tractor, nor a Moped
    //Methods don't do anything
    class NullVehicle: public Vehicle {
    public:
    void GetDescription();
    int GetPollutTax();
    };

    class VehicleFactory {
    public:
    // CreateVehicle makes vehicles, such as cars, tractors, mopeds and underfined vehicles.
    // parameter type means the type of the vehicle. 1 for a Car, 2 for a Tractor, 3 for a Moped, all the rest for an Underfined Vehicle
    // parameter engn means the number of cylinders in the vehicle
    // parameter whls stands for the number of wheels
    // parameter pltn_rt is a pollution rate. 15 for cars and tractors and 0 for mopeds.
    // parameter whl_tx_rt is a tax rate for the number of wheels. 0 for 2 wheels's vehicle and changes depending on the vehicle type
    // parameter stnd_vhcl equals 1 when we create a standard vehicle, for instance, a car with 4 cylinders and 4 wheels
    // parameter stnd_vhcl equals 0 when we create a vehicle, for instance, a car with 6 cylinders and/or 3 wheels
    virtual Vehicle *CreateVehicle(int type,int engn,int whls,int pltn_rt,int whl_tx_rt, int stnd_vhcl=1)=0;
    virtual void GetFactoryDescr() = 0;
    };

    //Chinese factory produces 2 cylinders' cars and 3 wheels' tractors
    //Assuming that it doesn't make standard cars and tractors
    class ChineseVF : public VehicleFactory {
    public:
    Vehicle *CreateVehicle(int type,int engn,int whls,int pltn_rt,int whl_tx_rt, int stnd_vhcl=0) {
    switch(type) {
    case TYPE_CAR:
    return new Car(CHN_CAR_ENGN,whls,pltn_rt,whl_tx_rt);
    case TYPE_TRACTOR:
    return new Tractor(engn,CHN_TRCT_WHL,pltn_rt,whl_tx_rt);
    case TYPE_MOPED:
    return new Moped;
    default: return new NullVehicle;
    }
    }
    void GetFactoryDescr() { cout<<"Using Chinese Factory."<<endl; }
    };

    //Home factory produces both standard and non-standard vehicles
    class HomeVF : public VehicleFactory {
    public:
    Vehicle *CreateVehicle(int type,int engn,int whls,int pltn_rt,int whl_tx_rt, int stnd_vhcl=1) {
    switch(type) {
    case TYPE_CAR:
    if (stnd_vhcl) return new Car;
    return new Car(engn,whls,pltn_rt,whl_tx_rt);
    case TYPE_TRACTOR:
    if (stnd_vhcl) return new Tractor;
    return new Tractor(engn,whls,pltn_rt,whl_tx_rt);
    case TYPE_MOPED:
    if (stnd_vhcl) return new Moped;
    return new Moped(engn,whls,pltn_rt,whl_tx_rt);
    default: return new NullVehicle;
    }
    }
    void GetFactoryDescr() { cout<<"Using Home Factory."<<endl; }
    };


    //Creating a vector of vehicles and calculate their total tax
    int _tmain(int argc, _TCHAR* argv[])
    {
    const size_t count = 2;

    vector<Vehicle *> v(VECTOR_LEN);
    VehicleFactory* vf[count] = { new ChineseVF(), new HomeVF() };

    int tax_sum;
    unsigned int i,j;

    tax_sum=0;

    for(i=0;i<v.size();i++) {
    j=rand()%2;
    v[i] = vf[j]->CreateVehicle(rand()%5,rand()%6+1,rand()%4,CYL_POL_RATE,WHEEL_TAX_RATE,rand()%2);
    vf[j]->GetFactoryDescr();
    v[i]->GetDescription();

    tax_sum=tax_sum+v[i]->GetTax();
    cout<<"------------------------------"<<endl;
    }

    cout<<"The Total Tax is "<<tax_sum<<"."<<endl;

    for(i=0;i<v.size();i++) delete v[i];

    for (i = 0; i < count; i++) delete vf[i];

    return 0;
    }
     
Загрузка...

Поделиться этой страницей