c++ 类之间的交流 模块之间通信 类之间调用 类之间的通信

刚开始编程的时候,我相信大家都跟我一样,是这样把两个类联系起来的(现用类A和类B举例):

class A

private:

B *b;

这样,当a需要的时候可以调用B类的函数方法

这样的缺点是:

1:A可以使用B的方法,B不可以使用A的方法(B看不到A);

2:内聚性弱,也就是a对象消失b对象一定消失(想像一下a,b是两个窗口,a是登陆,b是主页,当点击a上的按钮时生成b,但a界面不能消失释放,但实际情况下登陆成功后登陆界面消失),b对象生成失败a对象也就失败。

3:如果三个类,四个类,五个类之间交流,互相交流,但上述方法不可能实现

这个问题一直困扰了我很久,上述简单处理虽然可以解决一些基本的问题,但事实上两个类是如何通信 的呢?

其实方法有很多,大体思路是这样的:

定义一个类M,在M中让A和B作为其成员变量,(这样M中的函数就可以调用A,B中的函数方法),当A中想要发消息给B时,想方设法把消息给M,M再调用B中的函数传给B,那么这个"想方设法"是什么方法呢?

开始我是这么想的

M::M()

a=new A(this);//把当前的this指针传给a,这样在a的函数里就可以调用M的函数了。

编译会发生错误

为 什么捏?  是这样滴:在写类M的时候,要包含头文件#include“A.h”有木有!!,在写类A的函数的时候要包含头文件#include"M.h"有木有!! (因为在A的构造里要定义一个M类型的指针做实参啊!),这里就有问题,计算机执行时,1:走到#include“A.h”这一行代码时要先看看A.h里 有什么。2:走到A.h里的时候,发现有#include"M.h"这行代码,然后又进入M.h看看,3:执行1步骤。。。。。是不是循环,无限循环有木 有!!!所以报错。

解决方法有很多,例如监听A的函数,利用函数指针,利用全局函数(全局函数简单好用,但破坏了面向对象的封装性)

好了,不罗嗦了,正确答案如下:

用接口函数,interface,在c++下没有定义接口函数,其实接口函数就是纯虚函数,在vc下(别的我不知道行不行)可以这样:

#include 

using namespace std;

#define interface class __declspec(novtable)

interface InterFace

virtual void f();

};

为了解决那个让计算机迷糊的问题,我们让M继承InterFace,然后传参的时候传InterFace类型的,这样就不会重复包含了,试试:

#include"Interface.h"

#include"A.h"

#include"B.h"

class M :public InterFace

private:

A *a;

B *b;

public:

M()//构造

a=new A(this);//因为M继承InterFace所以可以用父类的指针来作为它的实参!

b=new B();

void f()

{

b->show();//调用B类方法

}

};

在A类:

#include"InterFace.h"

class A

{

public:

A(InterFace *i)

{

printf("A要调用M中的f()函数,让f()函数调用B的函数,这样A就成功通信到了B!");

i->f();//这里调用的是InterFace的f函数,不过在M类中实例化了

}

};

在B类:

#include"stdio.h"

class B

{

public:

void show()

{

printf("我被M调用了!");

}

};

int mian()

{

M m;

return 0;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,695评论 0 3
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,340评论 0 2
  • //出自51博客:www.Amanda0928.51.com 第一章 一、选择题 1.B; (typedef ,t...
    Damongggggg阅读 11,124评论 0 1
  • 图片发自简书App ‘哎,你这孩子真是,我们可都是为你好啊,不听老人言吃亏在眼前啊~’(说得就好像你是来拯救世界似...
    CocoWu美人阅读 951评论 0 6
  • ·《物种起源》 达尔文 ·《心理学与生活》 菲利普·津巴多 《追寻记忆的痕迹》 坎德尔 ·《影响力》罗伯特 ·《社...
    飒然的秋阅读 123评论 4 0