真正开始用面向对象思维写程序
今天,认为自己真正的在用面向对象的思维方式在写程序,其实,也没有那么难,以前都已经实现了的东西,是用结构化的思维完成的,现在把它们整理一个一个的类,关键问题是类和类之间存在着关联,第一步,如何将它们关联起来?这里说的是“整体”和“部分”的关系:
假设物理世界有一些设备,可能有示波器、频谱仪、三用表等等组成。这里把关键字“设备”、“示波器”各写成一个类,分别是“CInstrument”(设备类)、“COscillograph”(示波器类),各自的C++描述:
- //instrument.h description 设备类描述
- #pragma once
- #include "oscillograph.h"
- class COscillograph;
- class CInstrument
- {
- public:
- CInstrument();
- COscillograph *pOscillograph; //一个“示波器”对象指针
- //......
- //其他的一些具体仪器
- //………….
- };
注意上述头文件的第二行,#pragma once是该头文件仅被引用一次,是高版本的用法,低版本可以用:
- #ifndef __YOUR_H__
- #define __YOUR_H__
- //your hpp file
- //........
- #endif /* __YOUR_H__ */
该类是一个“仪器”类,头文件中用到了“示波器”类,正如第4行所写,先声明它一下。CInstrument(仪器)类中“包含”了一个COscillograph(示波器)的指针,好了,在CInstrument的构造函数中即可一个new一个COscillograph对象了:
- CInstrument::CInstrument()
- {
- pOscillograph = new COscillograph(this);
- }
注意: new COscillograph(this)中的this,看到COscillograph的类描述,才明白this的含义。下面是COscillograph(示波器)的描述:
- //oscillograph.h description
- #pragma once
- #include "instrument.h"
- class CInstrument;
- class COscillograph
- {
- public:
- COscillograph(CInstrument *pInstrument);
- CInstrument *pInstrument; //一个“仪器”类指针
- //......
- };
可能会看到:instrument.h和oscillograph.h两个头文件互相递归引用,不会出错吗?这也正是#pragma once以及每个类均在互相声明对方是“指针“的原因。看看COscillograph(示波器)类的构造函数,用一个仪器类来初始化它,想干什么?示波器在使用中想使用仪器类中的其他设备,如频谱仪或三用表的某些功能,目的是通过该类中的pInstrument指针,通过它,再得到具体设备的“指针”。好了,看看COscillograph(示波器)构造函数的具体实现吧:
- COscillograph::COscillograph(CInstrument *pInstrument)
- {
- this->pInstrument = pInstrument;
- //......其他初始化.........
- }
上面的this->pInstrument是指的COscillograph类中的pInstrument指针。还记得CInstrument的构造函数吗?里面new一个COscillograph对象时,将CInstrument的指针通过参数传递进来了。
剩下的工作,是在COscillograph或CInstrument类中专心实现各自特定功能了。