-
2019-09-10 14:38:18
两个类A和B实现互相调用彼此的方法,如果采用彼此包含对方头文件的方式会出现循环引用,所以采用了类的前置声明的方式:
1.class A采用前置声明的方式声明class B
2.在ClassB的头文件中包含class A 的头文件
3.在class A中只能声明class B类型的指针或者引用
具体代码如下:
A.h
#pragma once class B; class A { public: A(); A(class B* pB); ~A(); public: void displayA(); void invokeClassBInClassA(); private: class B *mB; };
A.cpp
#include "A.h" #include "B.h" #include <iostream> using namespace std; A::A() {} A::~A() {} A::A(B* pB) { mB = pB; } void A::displayA() { cout << "this is A" << endl; } void A::invokeClassBInClassA() { cout << "class A invoke class B starts>>" << endl; mB->displayB(); }
B.h
#pragma once #include "A.h" class B { public: B(); ~B(); public: void displayB(); void invokeClassAInClassB(); private: class A * mA; };
B.cpp
#include "B.h" #include <iostream> using namespace std; B::B() { mA = new A(); } B::~B() {} void B::displayB() { cout << "this is the B" << endl; } void B::invokeClassAInClassB() { cout << "class B invoke class A starts >>" << endl; mA->displayA(); }
main.cpp
#include <iostream> #include "A.h" #include "B.h" using namespace std; int main() { cout << "----------main starts---------------" << endl; class B* pB = new B(); class A* pA = new A(pB); pA->displayA(); pA->invokeClassBInClassA(); pB->displayB(); pB->invokeClassAInClassB(); cout << "----------main ends----------------" << endl; return 0; }
更多相关内容 -
【六】C & C++ 函数相互调用
2015-08-15 16:54:21在项目中融合C++和C代码是实际工程中不可避免的,虽然C++编译器能够兼容C语言的编译方式,但C++编译器会优先使用C++的方式进行编译,为了让它们能互相调用,可以利用extern关键字强制让C++编译器对代码进行C方式编译...目录
在项目中融合C++和C代码是实际工程中不可避免的,虽然C++编译器能够兼容C语言的编译方式,但C++编译器会优先使用C++的方式进行编译,为了让它们能互相调用,可以利用extern关键字强制让C++编译器对代码进行C方式编译!
1、C++调用C编写的函数
假设有如下的代码:
main.cpp#include <iostream> #include "test.h" using namespace std; int main(int argc, char *argv[]) { cout << "add =" << add(5, 5) << endl; //add函数由C语言编写,并由gcc按C语言方式编译 return 0; }
test.h#ifndef _TEST_H_ #define _TEST_H_ int add(int a, int b); #endif
test.c#include "test.h" int add(int a, int b) { return a + b; }
首先,我们使用gcc编译器,对test.c进行编译,生成test.o文件,然后供main.cpp使用!gcc -Wall -g -c test.c
然后,使用g++编译main.cpp
g++ -Wall -g main.cpp test.o -o main
这时会看到编译器报错:
改正方法:
将main.cpp改为如下:
#include <iostream> //告诉编译器,test.h头文件中所有函数是C语言编译出来的 extern "C" { #include "test.h" } using namespace std; int main(int argc, char *argv[]) { cout << "add =" << add(5, 5) << endl; return 0; }
再试着编译,就能通过了!
2、C调用C++编写的函数
假设有如下的代码:
main.c
#include <stdio.h> #include "test.h" int main() { printf("add = %d\n", add(1,2)); //add函数由C++编写 return 0; }
test.h
#ifndef _TEST_H_ #define _TEST_H_ int add(int a, int b); #endif
test.cpp
#include "test.h" int add(int a, int b) { return a+b; }
首先,我们使用g++编译器,对test.cpp进行编译,生成test.o文件,然后供main.c使用!编译命令:
g++ -Wall -g -c test.cpp
然后,使用gcc编译器,编译main.c:
gcc -Wall -g main.c test.o -o main
可以看到,这里编译器会报错:
改正方法:
在test.cpp中改成如下内容,让g++采用C的编译方式对它进行编译:
extern "C" { #include "test_1.h" int add(int a, int b) { return a+b; } }
再次编译,就不会出错了!
3、统一的解决方案
- __cplusplus是C++编译器内置的标准宏定义
- __cplusplus的意义
- 让C代码即可以通过C编译器的编译,也可以在C++编译器中以C方式编译
因此,我们通常在要把C++函数库链接到C程序中时,在C++源代码中做如下的定义:
#ifdef __cplusplus extern "C" { #endif //函数声明 或 函数定义 #ifdef __cplusplus } #endif
这样,g++编译器会自动以C的方式编译该代码!
4、注意
- C++编译器不能以C的方式编译多个重载函数!
原因很简单,C语言中不支持函数重载!
-
C++ 包含类两个类互相调用彼此的类成员变量和方法
2017-09-13 16:16:04C++,C 包含类两个类互相调用彼此的类成员变量和方法,里面介绍了如何在头文件中创建相互的类对象,简单易懂 -
C++ 保存在两个cpp文件中函数 怎样声明才能互相调用
2018-11-08 02:02:55C++ 保存在两个cpp文件中函数 怎样声明才能互相调用分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
主函数所在cpp:#include "menu_1.cpp"#include "menu_2.cpp"void main(){ char choice; do{ choice=_getch(); }while(choice!='0'&&choice!='1') switch(choice) case '0': menu_1(); case '1': menu_2();}menu_1()所在menu_1.cpp:void menu_1(){ //其他操作 char choice; do{ choice=_getch(); }while(choice!='0'&&choice!='1') switch(choice) case '0': exit(0); case '1': menu_2(); }menu_2()所在menu_2.cpp:void menu_2(){ //其他操作 char choice; do{ choice=_getch(); }while(choice!='0'&&choice!='1') switch(choice) case '0': exit(0); case '1': menu_1(); }由于作业需要,必须将menu_1和menu_2放在两个cpp文件中,但按我那样在主函数前声明的话,编译时会在menu_1.cpp中menu_2();那一行显示无法识别标识符menu_2(),哪位老虾帮帮忙,指点下该怎么声明?编辑环境是VisualStudio2008
给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
-
C++两个类互相调用彼此的方法
2020-09-26 09:36:44今天在学习c++primer 第七章的时候,做练习题出现了个问题,如下: X.h文件代码: #pragma once #include"Y.h" class X { public: private: Y* y = nullptr; }; Y.h文件代码: #pragma once #include"X.h" ...今天在学习c++primer 第七章的时候,做练习题出现了个问题,如下:
X.h文件代码:
#pragma once #include"Y.h" class X { public: private: Y* y = nullptr; };
Y.h文件代码:
#pragma once #include"X.h" class Y { public: private: X x; };
main函数:
#include"X.h" #include"Y.h" int main() { X x; Y y; }
出现错误:
1>X.cpp 1>C:\Users\44338\Documents\C++\c++\c++\Y.h(8,5): error C3646: “x”: 未知重写说明符 1>C:\Users\44338\Documents\C++\c++\c++\Y.h(8,5): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 1>Y.cpp 1>C:\Users\44338\Documents\C++\c++\c++\X.h(9,3): error C2143: 语法错误: 缺少“;”(在“*”的前面) 1>C:\Users\44338\Documents\C++\c++\c++\X.h(9,3): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 1>C:\Users\44338\Documents\C++\c++\c++\X.h(9,16): error C2238: 意外的标记位于“;”之前 1>factMain.cpp 1>C:\Users\44338\Documents\C++\c++\c++\Y.h(8,5): error C3646: “x”: 未知重写说明符 1>C:\Users\44338\Documents\C++\c++\c++\Y.h(8,5): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
原因:两个类A和B实现互相调用彼此的方法,如果采用彼此包含对方头文件的方式会出现循环引用,所以采用了类的前置声明的方式
在X中用class声明Y即可:
#pragma once class Y; class X { public: private: Y* y = nullptr; };
-
C++ 两个类互相调用
2018-11-22 15:35:57总所周知,我们想要调用一个类,一定要添加他的头文件。例如,class A 调用class B, 在class A 头文件中,这样子就可以了。如: A.h #ifndef A_H #define A_H #include "B.h" class A { public: A(); B... -
c++中构造函数的相互调用
2018-07-28 22:54:39c++中构造函数的相互调用 -
C++随笔——成员函数的相互调用问题:
2017-10-03 23:08:16C++随笔——成员函数的相互调用问题: -
C++函数的嵌套调用和递归调用学习教程
2021-01-01 12:22:12虽然C++不能嵌套定义函数,但可以嵌套调用函数,也就是说,在调用一个函数的过程中,又调用另一个函数。 在程序中实现函数嵌套调用时,需要注意的是:在调用函数之前,需要对每一个被调用的函数作声明(除非定义在前... -
C++:两个cpp文件间如何进行各自函数的调用
2021-07-14 11:01:24#两个.cpp文件间如何进行各自函数的调用 -
C++对象模型的那些事儿之六:成员函数调用方式
2021-02-01 15:25:31C++的成员函数分为静态函数、非静态函数和虚函数三种,在本系列文章中,多处提到static和non-static不影响对象占用的内存,而虚函数需要引入虚指针,所以需要调整对象的内存布局。...本质上,这两个函数是 -
C++两个类相互调用
2017-12-06 16:50:34C++两个类相互调用 -
C/C++函数调用的几种方式总结
2021-10-07 10:44:49但是,当高级语言被编译成计算机可以识别的机器码时,有一个问题就凸现出来:在CPU中,计算机没有办法知道一个函数调用需要多少个、什么样的参数,也没有硬件可以保存这些参数。也就是说,计算机不知道怎么给这个... -
C++:构造函数中调用虚函数
2020-01-08 20:25:33来源:牛客网 class A ... virtual void func() { std::cout‘ ’;...如果构造函数调用虚函数的话,基类的构造函数调用基类的虚函数...如果派生类里面有两个同样的非虚函数,使用基类指针调用的话会调用基类的函数。 -
C++内部函数与外部函数 | 调用外部Max函数
2020-12-01 09:23:07内部函数是指一个函数只能被本文件中其他函数所调用,在定义内部函数时,在函数名和函数类型的前面加static。 函数首部的一般格式为 static 类型标识符 函数名(形参表) //如 static int Max(int num1,int num2) ... -
c与c++的相互调用
2021-05-23 02:37:06因为项目本身是通过纯c语言编写,而gtest则是一个c++编写的测试框架,其中必然涉及c与c++之间的相互调用。注意,本文的前提是,c代码采用gcc等c语言编译器编译c代码,采用g++等c++编译器编译c++代码,如果c和c++代码... -
C++动态链接库的两种调用方式
2020-12-22 15:56:07只有在其它模块调用动态链接库中的函数时,它才发挥作用。Windows API中的所有函数都包含在DLL中。其中有3个重要的DLL,Kernel32.dll,它包含用于管理内存、进程和线程的各个函数;User32.dll,它包含用于执行用户... -
C++ 一个类成员函数调用另一个类成员的方法
2020-01-15 14:33:11在继承之外,在C++中一个类成员函数调用另一个类成员的方法主要有:类的组合,友元类,类的前向声明,单例模式等,下面主要讲讲这4种方法的实现 方法1:利用类的组合 组合通俗来讲就是类B有类A的属性,如声明一个... -
计算机程序设计c++ 5-1:函数的调用格式
2021-10-20 22:40:08函数调用 函数定义后,并不能自动执行,必须通过函数调用来实现函数的功能。 函数调用,即控制执行某个函数。 C++中,主函数可以调用其它子函数,而其它函数之间也可以相互调用。 在本节中,我们将介绍一下内容: ... -
C++ 两个包含类互相调用彼此的类成员变量和方法
2017-09-13 16:23:00C++ 两个包含类互相调用彼此的类成员变量和方法 -
c++ 类的互相调用的方法
2010-12-25 13:29:33c++ 类的互相调用的方法,是今天弄明白的,这里提供例子和说明给大家参考,从而告诉大家C++中类与类之间的关系,是不能烂用乱用的.希望能给大家启发. -
C++ 类成员函数调用
2019-04-21 22:39:49今天看了一篇写得很好的博客:类成员函数调用分析 看完后,有一些小的心得,大概是帮我理了一遍吧。...与静态成员变量和非静态成员变量不同的是:静态成员函数和非静态成员函数存放在代码区,这两种函数调用时把当... -
C/C++文件中函数互相调用
2012-10-17 10:42:21C/C++文件中函数互相调用: 1,在C++中调用C函数: 方法一: 1)c语言头文件:cExample.h #ifndef C_EXAMPLE_H #define C_EXAMPLE_H extern int add(int x,int y); #endif 2) c语言实现... -
C++何时调用构造函数,何时调用析构函数
2021-03-05 18:57:12同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题 c++利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作。 对象的初始化和清理工作是... -
C#调用c++函数的dll文件,同时实现c++调用c#函数
2020-04-12 16:43:33解压后是两个项目,一个c++DLL,一个c#控制台。C#调用c++函数的dll文件,同时实现c++调用c#函数,解决了错误,可以正常运行。如果有其他问题,可以互相讨论。 -
C++函数定义和调用过程(超详细)
2021-05-22 08:33:53所有函数定义包括以下组成部分:名称:每个函数都必须有一个名称。通常,适用于变量名称的规则同样也适用于函数名称。形参列表:调用函数的程序模块可以向其发送数据。形参列表是保存传递给函数的值的变量列表。如果... -
C 与 C++ 接口函数相互调用
2018-12-24 11:48:45理解接口调用的关键在于理解函数名称在编译过程改编的原理和 extern "C" 的原理。 -
C++函数调用 两个数比较大小。
2020-05-25 21:45:28#include<stdio.h> float max(float x, float y) { float m; if(x>y) m=x; else m=y;...printf(“请输入两个数:”); scanf ("%f %f",&a,&b); m=max(a,b); printf(“最大值是%f\n”,m); } -
C函数和C++函数相互调用的问题,extern “C“(★firecat推荐★)
2018-02-08 09:19:26http://blog.csdn.net/xiexingshishu/article/details/40679403http://it.zuocheng.net/c-cpp-mix-programe1、如何C++程序要调用 已编译后的C函数,该怎么办?(1)假设某个C函数的声明如下:void foo(int x, int y)...