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&).
我正在学习关于观察者模式的教程,我遇到了以下问题。
也就是说,我有以下基础类:
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&).