c++两个类相互调用
有可能会碰到两个类之间的相互调用的问题,例如:定义了类A和类B,A中使用了B定义的类型,B中也使用了A定义的类型
class A {
B b;
};
class B {
A a;
};
编译器在声明A的时候,由于B的声明在A的下面所以出现编译错误
那么,在定义时如果要相互调用肯定会需要相互包含头文件,如果仅仅只是在各自的头文件中包含对方的头文件,是通不过编译的:
//a.h
#include"b.h"
class A {
public:
B xianghuInA;
}; //b.h
#include"a.h"
class B {
public:
A xianghuInB;
};
怎么办?一般的做法是
1)class B采用前置声明的方式声明class A
2)在class B中只能声明class A类型的指针,因为定义指针时不需要对那个类的定义可见
3)在class A的头文件中包含class B 的头文件
//a.h
#pragma once
#include"b.h" //一定要有
class A {
public:
B xianghuInA;
int a = ;
void funA();
};
//b.h
#pragma once
#include<iostream> class A;
class B {
public:
int b = ;
A* xianghuInB = NULL; //一定要是指针
void funB();
~B();
};
//a.cpp
#include"a.h"
#include<iostream>
using namespace std; void A::funA()
{
cout << xianghuInA.b << endl;
}
//b.cpp
#include"b.h"
#include<iostream>
#include <typeinfo>
using namespace std; void B::funB()
{
cout << typeid(xianghuInB).name() << endl;
} B::~B() {
delete xianghuInB;
}
//main.cpp
#include<iostream>
#include"a.h"
#include"b.h"
using namespace std; int main()
{
A qq;
qq.funA();
B hh;
hh.funB();
return ;
}
运行结果:

或者:
//main.cpp
class B;
class A {
B* b;
}; class B {
A a;
};
c++两个类相互调用的更多相关文章
- Cocos Creator两个类相互引用(调用)
如果两个类相互引用,脚本加载阶段就会出现循环引用,循环引用将导致脚本加载出错:///////////Game.jsvar Item = require("Item");var Ga ...
- 多态时最好将基类的析构函数设为virtual、 C++中两个类相互包含引用问题 (转载)
多态:http://blog.csdn.net/tmljs1988/article/details/8146521 C++中两个类相互包含引用问题:http://blog.csdn.net/leo11 ...
- c++中两个类相互包含引用的相关问题
在构造自己的类时,可能会遇到两个类相互引用的问题. 例如: class A { int i; B b; }; class B { int i; A a; }; 在这种情况下,这样就会出现一个死循环a. ...
- 谈谈java中静态变量与静态方法在有继承关系的两个类中调用
谈谈java中静态变量与静态方法在有继承关系的两个类中调用 学习的中如果遇到不明白或者不清楚的的时候,就是自己做些测试,自己去试试,这次我就做一个关于静态变量和静态方法在有继承关系的两个类中的问题测试 ...
- C++两个类相互包含引用的问题
在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { B b; } class B { A* a; } 请 ...
- C++中两个类相互包含引用问题
在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { int i; B b; } class B { in ...
- C++中两个类相互include的问题
在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 例如: Cup.h #ifndef CUP_H #define CUP_ ...
- java中各个类相互调用资源的原理
当我们要进行跨类的调用/使用的时候,比如当前类调用另一个类中的变量或方法时, 这时需要一定的条件,如果那些将要被调用的变量或方法是static(静态)变量,也叫类变 量,那么可以通过类名调用,相 ...
- C++两个类相互引用错误留影
java中类相互引用很方便,c++中有编译顺序的问题 c++声明作用,告诉编译器,我声明的东西你要是找不到,那就跳过去吧,等全编译完你就可以找到了. C1.h #pragma once #includ ...
随机推荐
- 知识点:spring 完全手册
什么是spring spring是一个开源框架,为简化企业级开发而生,使用spring可以使简单的java bean 实现以前只有EJG才能实现的功能. Spring是一个轻量级的控制反转(IoC)和 ...
- springBoot 整合mybaits 逆向工程
pom.xml文件中增加配置项 <build> <plugins> <plugin> <groupId>org.springframework.boot ...
- linux服务之apache(二)
1.ip/pv/uv(用来统计网站被访问情况) ip:表示该网站一天被多少ip访问过,一天一个ip之算做一次. pv:表示页面被访问的次数 uv:独立访客,一个用户就是一个uv. 2.创建虚拟主机 利 ...
- input输入完成后监听
clearTimeout(serachtimer); serachtimer=setTimeout(function(){ xxxxxxx //这里写处理的方法 },1000)
- oracle入坑日记<五>数据表
1 数据表 1.1.数据表是存放数据字段信息的地方:在Oracle,数据表拥有者单位是用户,同时数据表属于表空间.如: 登录my_user用户在orcl表空间下创建的表就是 my_user用户在o ...
- exchang2010OWA主界面添加修改密码选项
原文链接:http://www.mamicode.com/info-detail-1444660.html exchange邮箱用户可以登录OWA修改密码,当AD用户密码过期或者重置密码勾选了“用户下 ...
- luigi 学习
1.mac 上安装luigi pip install luigi pip install boto3 (luigi依赖 boto3) 2.基本概念 class Streams(luigi.Task): ...
- Django Forms 表单
环境 python 3.7 服务端 views.py from django import forms # 引入 froms 模块 from django.forms import widgets ...
- JavaScript倒计时实现
/** * 倒计时函数 * @param {String}} endTime 终止时间戳 */ const countDown = (endTime, callback) => { const ...
- 剑指offer例题——反转链表
题目描述 输入一个链表,反转链表,输出新链表的表头 程序编写 将链表反转 public class Solution { public ListNode ReverseList(ListNode he ...