C++ 类转发声明C++;

C++ 类转发声明C++;,c++,class,forward-declaration,C++,Class,Forward Declaration,我在学习观测者模式的教程时遇到了以下问题 也就是说,我有以下基类: class Subject; class Observer; 接下来,我想再定义两个类 class StockGrabber: public Subject { //... //the constructor involves a StockObserver object StockGrabber(StockObserver so){....}; } class StockObserver: publ

我在学习观测者模式的教程时遇到了以下问题

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

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)成员函数的签名进行一些更改,因为如果您按值传递参数,则不仅需要参数类的声明,还需要定义。如果通过引用传递,那么声明就足以声明函数,但该声明肯定不足以实现该函数,因此在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&).

java中的等效代码将意味着引用语义,而C++代码显示了值语义。您可能希望更改为使用引用语义。为了回答您的问题,其中一个函数体需要定义得不一致才能使用转发声明。@R_Sahu:谢谢,但当我编译它时,给出了错误“变量的类型不完整”StockGrabber。有什么提示吗?“虽然这会编译,但实际上不可能创建所涉及的类的任何实例。@R_Sahu,这只起作用,因为构造函数只是默认的构造函数。假设您填写了详细信息,则会发生错误。方法是先做一个正向声明,然后在类内声明函数,然后在StockObserver类后定义函数。@新手,如果你能就这个问题发表一篇文章就好了。@R_Sahu谢谢你的输入。您的代码已编译,但我的代码未编译,因为我在函数的定义中有更多的细节,有些变量直到代码的后面才定义。