下面的程序是关于多态性的。它只是在打开和关闭之间改变门的状态。我的问题是我无法将“打开”类中的状态切换为关闭,因为“关闭”类低于我的“打开”类。
我如何转发声明类“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/