c++ - 继承类的前向声明

标签 c++ c++11

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

我如何转发声明类“Close”使其正常工作? (因为像“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;
}

关于c++ - 继承类的前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34982517/

相关文章:

c++ - 自动将 c++11 auto 关键字重写为派生类型

c++ - C++11 中的安全 bool 成语是否已过时?

c++ - 为什么 std::shuffle 采用右值引用?

c++ - 思考C++源码错误

c++ - 多态中的函数对象

c++ - cocos2dx v3.7 如何防止反弹?

c++ - 使用非专用模板化类型作为模板参数

c++ - 声明 float ***c 的含义

c++ - 来自 Protocol Buffer 消息的普通结构

c++ - Visual C++ 错误 : RegGetValueA could not be located