Class 前向声明 C++

Class Forward Declaration C++

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

也就是说,我有以下基础类:

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

是的,您可以使用 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;
}

不清楚您希望如何使用构造函数的参数。使用构造函数的参数时会有挑战。

前向声明是不够的,你必须对 StockObserver::StockGrabber(StockObserver so) 成员函数的签名做一些改变,因为如果你按值传递参数,你需要的不仅仅是声明的定义参数' class。如果您通过引用传递,那么声明足以声明该函数,但该声明肯定不足以实现该函数,因此您可能必须在 StockObserver [= 之后在 class 之外定义该函数14=] 定义。看看下面的代码,会更容易理解。

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&).