[英]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.