我正在关注观察者模式的教程,我遇到了以下问题。
即,我有以下基类:
class Subject;
class Observer;
接下来,我想再定义两个类
class StockGrabber: public Subject {
//...
//the constructor involves a StockObserver object
StockGrabber(StockObserver so){....};
}
class StockObserver: public Observer {
//...
StockObserver(StockGrabber sg) {....};
}
我有什么方法可以使用前向声明,以便StockGrabber知道StockObserver存在吗?鉴于他们的相互依赖性,我不能只交换两个班级的职位。
我该如何解决这个问题? (原始教程是用Java编写的,但我试图用C ++实现它)谢谢!
答案 0 :(得分:1)
前向声明是不够的,您必须对StockObserver :: StockGrabber(StockObserver so)成员函数的签名进行一些更改,因为如果按值传递参数,则不仅需要定义参数的声明'类。如果你通过引用传递,那么声明就足以声明函数了,但是这个声明对于函数的实现来说肯定不够,所以你可能需要在StockObserver类定义之后定义类之外的函数。看看下面的代码,它会更容易理解。
class Subject{ /* ... */ };
class Observer{ /* ... */ };
class StockObserver;
class StockGrabber: public Subject {
//...
//the constructor involves a StockObserver object
StockGrabber(StockObserver& so); // class StockObserver is declared before StockGrabber::StockGrabber(StockObserver&).
};
class StockObserver: public Observer {
//...
StockObserver(StockGrabber sg) { /* ... */ };
};
StockGrabber::StockGrabber(StockObserver& so){ /* ... */ } // class StockObserver is defined before StockGrabber::StockGrabber(StockObserver&).
答案 1 :(得分:0)
是的,您可以使用StockObserver
的前向声明。以下程序成功构建。
class Subject {};
class Observer {};
class StockObserver;
class StockGrabber: public Subject {
StockGrabber(StockObserver so);
};
class StockObserver: public Observer {
StockObserver(StockGrabber sg);
};
StockGrabber::StockGrabber(StockObserver so) {}
StockObserver::StockObserver(StockGrabber sg) {}
int main()
{
return 0;
}
目前尚不清楚如何利用构造函数的参数。使用构造函数的参数时会遇到挑战。