下面的程序是关于多态的。它只是改变了打开和关闭之间门的状态。我的问题是我无法将班级“打开”中的状态切换为关闭,因为班级“关闭”低于我的班级“打开”。
我怎样才能转发声明“关闭”类它能正常工作? (因为正常的前向声明如'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;
}
答案 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
类型的对象。