繁体   English   中英

继承类的前向声明

[英]Forward declaration of inherit class

下面的程序是关于多态的。 它只是在打开和关闭之间改变门的状态。 我的问题是,由于类“关闭”低于类“打开”,我无法将类“打开”中的状态切换为关闭。

如何转发类“ Close”以使其正常工作? (由于正常的前向声明(例如“类关闭;”似乎不起作用))

class Status;

class Door {
    private:
        Status* currentStatus;
    public:
        void setStatus(Status*);
        void opendoor();
        void closedoor();
};

class Status {
    public:
        virtual void opendoor(Door* s)=0;
        virtual void closedoor(Door* s) = 0;
};

class Open : public Status {
    public:
        void opendoor(Door* s) {
            return;
        }
        void closedoor(Door* s){
            s->setStatus( new Close() ); //Error here
            return;
        }
};

class Close : public Status {
    public:
        void opendoor(Door* s) {
            s->setStatus( new Open() );
            return;
        }
        void closedoor(Door* s){
            return;
        }
};

void Door::opendoor() {
    currentStatus->opendoor(this);
    return;
}

void Door::closedoor(){
    currentStatus->closedoor(this);
    return;
}

void Door::setStatus(Status* x) {
    delete currentStatus;
    currentStatus = x;
    return;
}

最简单的方法是将类与实现分离:首先声明所有类。 然后仅执行成员函数。

class Status;
class Door {
    ...
};
class Status {
    ...
};

class Open : public Status {
    public:
        void opendoor(Door* s) override; 
        void closedoor(Door* s) override; 
};

class Close : public Status {
    public:
        void opendoor(Door* s) override; 
        void closedoor(Door* s) override; 
};
...
void Open::closedoor(Door* s){
     s->setStatus( new Close() ); //no more error here
     return;
}

定义需要的完整定义的成员函数Close全面实施 Close 例如,

void Open::closedoor(Door* s)

应该在class Close外部,在class Close之后定义。 那是因为

s->setStatus( new Close() )

编译器在尝试构造Close类型的对象时,需要了解Close的完整定义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM