【问题标题】:How to make composite objects global to derived classes using polymorphism?如何使用多态性使复合对象对派生类全局化?
【发布时间】:2015-05-01 20:30:34
【问题描述】:

我编写了一个程序,允许用户取出和返回车辆。例如,用户决定将汽车用于个人用途,那么剩余的车辆数量将从 2 减少到 1。问题是每当创建一个新对象时,复合车辆类别中的车辆数量将始终默认为 2,当您签出车辆时,它只会减少创建该对象的车辆数量。我不太擅长解释,所以也许这会有所帮助。

int main(){
int a = 0;
int vn;
int counter = 0;
VMS *tracking[20];
while (a != 6){
    cout << "(1) Company (2) Personal (3) Carpool (4) Cargo (5) Return a vehicle (6) Exit" << endl << "Select the appropriate application: ";
    cin >> a;
    switch (a){
    case 1: tracking[counter] = new company(); cout << "YOU ARE USER #" << counter << " PLEASE REMEMBER YOUR USER NUMBER"; counter++; break;
    case 2: tracking[counter] = new personal(); cout << "YOU ARE USER #" << counter << " PLEASE REMEMBER YOUR USER NUMBER"; counter++; break;
    case 3: tracking[counter] = new carpool(); cout << "YOU ARE USER  #" << counter << " PLEASE REMEMBER YOUR USER NUMBER"; counter++; break;
    case 4: tracking[counter] = new cargo(); cout << "YOU ARE USER #" << counter << " PLEASE REMEMBER YOUR USER NUMBER"; counter++; break;
    case 5: cout << "Please enter your User #: "; cin >> vn; tracking[vn]->returned(); break;
    case 6: exit(1); break;//exit
    }

因此,每次选择 1 - 4 时,都会创建一个新对象,并且每次都会有一个复合车辆类的新实例,默认 2 为剩余车辆数量。我想要做的是以某种方式使类车辆中的车辆数量为所有创建的对象全局递减,以便当车辆数量 = 0 时,会显示这样的提示。有没有办法通过在基类中仍然有车辆类组合来实现这一点? 我不太确定要包含哪些代码会有所帮助,所以我认为这些可能会有所帮助。
基类:

class VMS{
public:
    VMS(){}
    virtual void set();
    virtual void print();
    virtual void returned();
    virtual void setV();
private:
    string purpose;
    string dName;
    int emplidNum;
    string date;
    string Time;
    string rtime;
    vehicle vehicle;//Composition of vehicle class
};
#endif

车辆类别:(组成)

class vehicle{
public:
vehicle() { sedan = 2, pickup = 2, minivan = 2; }
bool empty1(){
    if (sedan == 0){
        cout << "All Vehicles of this type are in use, please select a different vehicle" << endl;
        return true;
    }
    else
        return false;
}
bool empty2(){
    if (pickup == 0){
        cout << "All Vehicles of this type are in use, please select a different vehicle" << endl;
        return true;
    }
    else
        return false;
}
bool empty3(){
    if (minivan == 0){
        cout << "All Vehicles of this type are in use, please select a different vehicle" << endl;
        return true;
    }
    else
        return false;
}
//the vehicle objects
int sedan;
int pickup;
int minivan;
};
#endif

对不起,帖子的长度。任何帮助将不胜感激。

【问题讨论】:

    标签: c++ polymorphism composition


    【解决方案1】:

    要使值独立于类的任何实例,您可以使用静态变量。你只需在你的类中声明变量static,它们对于类的所有实例都是同一个变量。如果您将sedanpickupminivan 的声明更改为

    static int sedan;
    static int pickup;
    static int minivan;
    

    变量将是全局的。

    您将无法在类的构造函数中初始化这些值,因为这样做会在每次创建 vehicle 的新实例时重置值。您必须有一个初始化方法来初始化这些值。所以如果你创建一个这样的方法

    static void vehicle::init()
    {
        sedan = 2;
        pickup = 2;
        minivan = 2;
    }
    

    并且您在程序开始时调用它,值将像在您的代码中一样被初始化。

    您可以阅读有关statichere 和存储持续时间说明符here 的更多信息。


    正如 dwcanillas 所指出的,实现这一点的更 oop 方法是拥有一个跟踪某些车辆的 garage 类。所以你可以有这样的课程

    class garage
    {
    public:
       vehicle getVehicle();
       void returnVehicle();
    
       garage(int numVehicles);
    
    private:
       int numVehicles;
    
    };
    

    跟踪所有车辆,或仅跟踪特定车辆子集,因此您可能有一个garage 用于轿车,一个用于小型货车,一个用于皮卡。

    【讨论】:

    • 这个答案是正确的,但似乎 OP 的设计也存在缺陷。让Garage 类充当vehicles 的分发者并跟踪每个vehicle 中有多少可用会更有意义。
    • 嗨,我非常感谢这个答案,但似乎当我写静态 int 轿车 = 2 时,我得到一个错误,我必须使这个 const static int 轿车 = 2。如果它是 const i将无法减少和增加车辆。
    • @ricefieldboy 抱歉,已编辑以解决该问题。你必须有一个初始化方法来初始化不是 const 的静态变量。
    猜你喜欢
    • 2021-08-21
    • 2010-10-08
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 2011-08-09
    相关资源
    最近更新 更多