继承类的前向声明

时间:2016-01-24 22:48:51

标签: c++ c++11

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

我怎样才能转发声明“关闭”类它能正常工作? (因为正常的前向声明如'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;
}

2 个答案:

答案 0 :(得分:2)

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

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;
}

答案 1 :(得分:1)

在完全实施Close之后,定义需要Close 完整定义的成员函数。例如,

void Open::closedoor(Door* s)

应在class Close之后在课堂外定义。这是因为在行

s->setStatus( new Close() )

编译器需要知道Close的完整定义,因为它试图构造Close类型的对象。