三个类之间的相互调用实现

                                                         三个类之间的相互调用

        由来:在项目开发的时候,定义了三个核心类(ClassA,ClassB, ClassC),三个类之间存在调用关系如下:ClassC是管理类,需要调用ClassA, ClassB的接口;同时作为被管理类,ClassA, ClassB需要又需要调用ClassC的接口。

        理清楚三类之间的关系

       1)定义顺序:ClassA, ClassB先于ClassC。

       2)调用关系:ClassC要调用ClassA的接口、ClassB的接口;ClassA要调用ClassC的接口,classB要调用ClassC的接口。

       其实,理清楚1),2)后我们发现,ClassA与ClassB之间并无直接调用关系(如果可以复杂点的话,可以再加处理)。

       核心点:两个类需要相互调用对端类的接口时,需要主要包含对方头文件及前向声明的问题,这个网上都有不少网友解答。举例上面ClassA与ClassC的关系如下:

        第一步:定义ClassA.h , classA.cpp , ClassC.h ClassC.cpp;

        第二步:在ClassC.h头文件加上 #include “ClassA.h”, 在ClassC的cpp文件中加上#include “ClassC.h”;

        第三步:在ClassA.h头文件中加上 #include “ClassA.h”, 在ClassA的cpp文件中加上 #include “ClassA.h” , #include “ClassC.h”。

        上面的不清楚的话,详见实践代码:

         代码实现:

 
/*
**ClassA.h
*/
#ifndefCLASSA_H_H
#defineCLASSA_H_H
 
classClassC;
 
classClassA
{
public:
       ClassA(ClassC* pC);
       ClassA();
       ~ClassA();
 
public:
       void displayA();
       void invoke_classC_in_ClassA();
 
public:
       ClassC* m_pC;
};
 
#endif
 
/*
**ClassA.cpp
*/
#include"stdafx.h"
#include"ClassA.h"
#include"classC.h"
#include<iostream>
usingnamespace std;
 
ClassA::ClassA(ClassC*pC)
{
       cout << "ClassA(ClassC* pC)constructor is running!" << endl;
       m_pC = pC;
}
 
ClassA::ClassA()
{
       cout << "ClassA() constructoris running!" << endl;
      
}
ClassA::~ClassA()
{
       cout << "ClassA destructor isrunning!" << endl;
}
 
 
voidClassA::invoke_classC_in_ClassA()
{
       cout <<"ClassA::invoke_classC_in_ClassA() is running" << endl;
       m_pC->displayC();
}
 
voidClassA::displayA()
{
       cout << "classA::displayA() isrunning!" << endl;
}
 
/*
**ClassB.h
*/
#ifndefCLASSB_H_H
#defineCLASSB_H_H
 
classClassC;
 
classClassB
{
public:
       ClassB(ClassC* pC);
       ClassB();
       ~ClassB();
 
public:
       void displayB();
       void invoke_classC_in_ClassB();
 
public:
       ClassC* m_pC;
 
};
 
#endif
 
/*
**ClassB.cpp
*/
 
#include"stdafx.h"
#include"ClassB.h"
#include"classC.h"
#include<iostream>
usingnamespace std;
 
ClassB::ClassB(ClassC*pC)
{
       cout << "ClassB(ClassC* pC)constructor is running!" << endl;
       m_pC = pC;
}
 
ClassB::ClassB()
{
       cout << "ClassB() constructoris running!" << endl;
      
}
ClassB::~ClassB()
{
       cout << "ClassB destructor isrunning!" << endl;
}
 
 
voidClassB::displayB()
{
       cout << "ClassB::displayB() isrunning!" << endl;
}
 
voidClassB::invoke_classC_in_ClassB()
{
       cout <<"ClassB::invoke_classC_in_ClassB() is running!" << endl;
 
       m_pC->displayC();
}
 
/*
**ClassC.h
*/
#ifndefCLASSC_H_H
#defineCLASSC_H_H
 
#include"ClassA.h"
#include"ClassB.h"
 
 
classClassC
{
public:
       ClassC();
       ~ClassC();
 
public:
       void displayC();
       void invoke_ClassA_in_ClassC();
       void invoke_ClassB_in_ClassC();
 
public:
       ClassA* m_pA;
       ClassB* m_pB;
};
 
#endif
 
/*
**ClassC.cpp
*/
#include"stdafx.h"
#include"ClassC.h"
#include<iostream>
usingnamespace std;
 
ClassC::ClassC()
{
       cout << "ClassC() constructoris running!" << endl;
 
       m_pA = new ClassA();
       m_pB = new ClassB();
      
}
ClassC::~ClassC()
{
       cout << "ClassC destructor isrunning!" << endl;
       if(NULL != m_pA)
       {
              delete m_pA;
              m_pA = NULL;
       }
       if(NULL != m_pB)
       {
              delete m_pB;
              m_pB = NULL;
       }
}
 
 
voidClassC::displayC()
{
       cout << "ClassC::displayC() isrunning!" << endl;
}
 
voidClassC::invoke_ClassA_in_ClassC()
{
       cout <<"ClassC::invoke_ClassA_in_ClassC() is running!" << endl;
       m_pA->displayA();
}
 
voidClassC::invoke_ClassB_in_ClassC()
{
       cout <<"ClassC::invoke_ClassB_in_ClassC() is running!" << endl;
       m_pB->displayB();
}
 
/*
**main.cpp
*/
#include"stdafx.h"
#include"ClassA.h"
#include"ClassB.h"
#include"ClassC.h"
#include<iostream>
using namespacestd;
 
intmain(int argc, char* argv[])
{
       ClassC* pC = new ClassC;
 
       cout << "C类调用A类:" << endl;
       pC->invoke_ClassA_in_ClassC();
 
       cout << endl << "C类调用B类:" << endl;
       pC->invoke_ClassB_in_ClassC();
 
 
       cout << endl << "A类调用C类:" << endl;
       ClassA* pA = new ClassA(pC);
       pA->invoke_classC_in_ClassA();
 
       cout << endl << "B类调用C类:" << endl;
       ClassB* pB = new ClassB(pC);
       pB->invoke_classC_in_ClassB();
 
       cout << endl;
    delete pB;
       delete pA;
       delete pC;
 
       return 0;
}


   运行结果:

             

  

       反思:其实完全可以转嫁为两个类之间的关系,类多了以后,理清类的单一职责原则,以及类之间的关系,类之间的调用接口很重要!

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
实现三个界面之间的跳转,可以使用Intent和startActivity方法。以下是一种实现方式: 1. 创建三个Activity,分别为ActivityA、ActivityB、ActivityC。 2. 在ActivityA中添加一个按钮,给按钮设置点击事件,在点击事件中创建一个Intent对象,并使用Intent的setClass方法将ActivityB作为目标Activity,最后调用startActivity方法启动ActivityB。 示例代码: ```java Button btn = findViewById(R.id.btn_activity_a); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(ActivityA.this, ActivityB.class); startActivity(intent); } }); ``` 3. 在ActivityB中同样添加一个按钮,给按钮设置点击事件,使用Intent跳转到ActivityC。 示例代码: ```java Button btn = findViewById(R.id.btn_activity_b); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(ActivityB.this, ActivityC.class); startActivity(intent); } }); ``` 4. 在ActivityC中同样添加一个按钮,给按钮设置点击事件,使用Intent返回到ActivityA。 示例代码: ```java Button btn = findViewById(R.id.btn_activity_c); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(ActivityC.this, ActivityA.class); startActivity(intent); } }); ``` 需要注意的是,要在AndroidManifest.xml文件中注册三个Activity,否则应用无法正常运行。 以上就是实现三个界面之间相互跳转的基本流程。当然,还有其他更复杂的跳转方式,例如使用Intent传递数据等,具体可以根据自己的需求来实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铭毅天下

和你一起,死磕Elastic!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值