Class Forward Declaration C ++

时间:2015-11-30 03:06:03

标签: c++ class forward-declaration

我正在关注观察者模式的教程,我遇到了以下问题。

即,我有以下基类:

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 ++实现它)谢谢!

2 个答案:

答案 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;
}

目前尚不清楚如何利用构造函数的参数。使用构造函数的参数时会遇到挑战。