C++类的交叉引用
对于C++中,两个类中相互引用对方,当然只能是在指针的基础上,于是我们知道。也就是说在A类的有一个指针引用B类的成员函数或成员对象,而B类中又有一个指针来访问A中的成员函数或对象。这就是C++中类的交叉引用编译于。那如何解决这个问题呢?
当然方法很多,但是我一般采用的方法就是声明与实现的分离。
也就是说类中的成员函数我们只在类中声明,然后函数的实现要放到另一个文件中去。
主要是在类中的交叉引用时候,存在一个谁先谁后的问题,也就是说假如A类中用B的指针引用了B的一个成员函数,如果B中没有引用A的成员,那问题好办,我们先在A类的头文件中引用B的头文件,于是我们保证先编译B,然后再编译A。
但是我们如果在B中也有一个A的指针引用了A的成员函数呢?
那么是先编译A还是先编译B呢? 如果先编译A,那么A中引用了B的成员函数,B还没编译呢! 如果先编译B,而B中又引用了A的成员函数呢!
这样就想当于死锁或者不停地迭代。那么如何解决呢?
方法就是先声明,再定义。直接看我们的解决方法:
class Observer(Observer.h)
#ifndef OBASER_H#define OBASER_H#include"Observerable.h"class Observerable;class Observer{private:Observerable *subject_;public:virtual void update(){};void observer(Observerable *s);~Observer();};#endif
class Observerable(Observerable.h)
#ifndef OBASERVERABLE_H#define OBASERVERABLE_H#include<iostream>#include<vector>#include<algorithm>class Observer;class Observerable{private:std::vector<Observer*> obsPtrs;public:void register_obs(Observer *obs_);void unregister_obs(Observer *obs);void notificate_obs();};#endif
class Observer
class Observerable
这里我们只是告诉编译器,我们有这么一个类存在,不是一般的错误或者什么重定义乱定义之类的。
然后在另两个文件中加类的成员函数的实现代码:
Observer.cpp
#include"Observer.h"#include"Observerable.h"void Observer::observer(Observerable *s){s->register_obs(this);}Observer::~Observer(){subject_->unregister_obs(this);}
Observerable.cpp
#include"Observerable.h"#include"Observer.h"void Observerable::notificate_obs(){for(int i=0;i<obsPtrs.size(); i++){if(obsPtrs[i]){obsPtrs[i]->update();}}}void Observerable::register_obs(Observer *obs_){obsPtrs.push_back(obs_);}void Observerable::unregister_obs(Observer *obs){std::vector<Observer*>::iterator obsIter;if((obsIter=std::find(obsPtrs.begin(),obsPtrs.end(),obs))!=obsPtrs.end()){obsPtrs.erase(obsIter);}}
成员函数有哪些了,以及其函数接口。
C++类的交叉引用的更多相关文章
- Word交叉引用
第一种:参考文献,用NE插入. 第二种:交叉引用. 先定义新的编号格式[1](主要解决参考文献格式自动编号的问题),感觉但是没有解决缩进的问题,需要Tab. 但是实验发现,通过谷歌学术引用的参考文献插 ...
- 交叉引用:Microsoft.NET标准异常 和错误代码对照表
简介 此表旨在帮助将Windows运行时应用程序错误代码交叉引用到Microsoft.NET标准异常,这些异常可以作为应用程序异常处理技术的一部分. 对照表 .NET Exception (Names ...
- C++学习笔记一 —— 两个类文件互相引用的处理情况
先记录一些零碎的知识点: 1. 一个类可以被声明多次,但只能定义一次,也就是可以 class B; class B; class B; ……; class B {……}; 这样子. 2. 一个 ...
- Word2013对公式处理:样式、自动编号、交叉引用
因快写毕业论文,专门研究了一下Word2013对公式的处理,有一点小心得,记在这里. 文章中公式展示的预期效果是:公式居中,尾端有编号,同时在文章中可以实现引用.实现该效果有很多方法,这里就说一种,其 ...
- 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针
您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...
- WPS2012交叉引用技巧,word比wps这点强更新參考文献
WPS2012交叉引用技巧,word比wps这点强更新參考文献 到时生成仅仅有有一条线,好像WPS不能够,word能够,假设谁知道能够补充.^_^ 1.写论文,參考文献的改动非 ...
- C++中基类对象的引用
代码: #include <iostream> #include <cstdio> using namespace std; class A{ public: void pri ...
- WPS2012交叉引用提示word比wps这种强烈的更新参考
WPS2012交叉引用技巧,word比wps这点强更新參考文献 到时生成仅仅有有一条线,好像WPS不能够,word能够,假设谁知道能够补充.^_^ 1.写论文,參考文献的改动非 ...
- word交叉引用公式编号时和连公式一起引用
如下所示: 假定一副待处理图像中的灰度值个数为m,灰度值为i的像素个数为 个,那么图像中的总像素数为N,公式如m=x+y (2)所示: m=x+y ...
随机推荐
- angularJs的ng-class切换class
在angular中为我们提供了3种方案处理class: 1:scope变量绑定 2:字符串数组形式. 3:对象key/value处理. 第一种我们不推荐使用,看看其他两种解决方案: 字符串数组形式 字 ...
- mysql数据库、表、字段、记录:增、删、改、查
/* 结构:数据库.表.字段.记录 操作:增删改查 */ -- 1.数据库:增删改查 create datebase if not exists jkxy; drop database if exis ...
- zabbix的一些优化参数随笔
StartDBSyncers=12 如果proxy过多 可以适当加大这个参数 ProxyConfigFrequency=60ProxyDataFrequency=60 这两个参数很重要,一个是ser ...
- php 正则提取数字
<?php//$patterns = "/^(http|https):\/\/(.)*\.(.)*$/";$patterns = "/\d+/";$str ...
- Salted hash password
参考文档 http://www.cnblogs.com/richardlee/articles/2511321.html https://en.wikipedia.org/wiki/Salt_%28c ...
- Java基础之在窗口中绘图——填充星型(StarApplet 2 filled stars)
Applet程序. import javax.swing.*; import java.awt.*; import java.awt.geom.GeneralPath; @SuppressWarnin ...
- Eclipse定制右键创建文件快捷菜单
打开窗口“Customize Perspective - Java EE”,切换选项卡到“Shortcuts”: 进行一下配置: “Generate”:如上图勾选方式 "Java" ...
- 视觉中的深度学习方法CVPR 2012 Tutorial Deep Learning Methods for Vision
Deep Learning Methods for Vision CVPR 2012 Tutorial 9:00am-5:30pm, Sunday June 17th, Ballroom D (Fu ...
- windows系统调用 临界区机制
#include "iostream" #include "windows.h" #include "cstring" using name ...
- 15. 星际争霸之php设计模式--策略模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...