精华内容
下载资源
问答
  • C++两个相互调用实现
    千次阅读
    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++,C 包含类两个互相调用彼此的类成员变量和方法,里面介绍了如何在头文件中创建相互的类对象,简单易懂
  • C++ 保存在两个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
    
     
    
     
    把#include "menu_1.cpp"#include "menu_2.cpp"这两句换成extern void menu_1();extern void menu_2();在menu_1.cpp开头加上extern void menu_2();在menu_2.cpp开头加上extern void menu_1();还有,你的代码中有语法错误void main(){ char choice; do {  choice=_getch(); } while(choice!='0'&&choice!='1'); // 这里要加分号 switch(choice) {         // switch后面要跟大括号 case '0':  menu_1();  break;       // 这里要加break case '1':  menu_2();  break; default:; }}main(), menu_1(),menu_2(),都是如此。此外,不知道你的"menu_1.cpp""menu_2.cpp"是否包含了_getch,exit的头文件要记得包含上

               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    展开全文
  • 今天在学习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:39
    c++中构造函数相互调用
  • C++随笔——成员函数相互调用问题:
  • 虽然C++不能嵌套定义函数,但可以嵌套调用函数,也就是说,在调用个函数的过程中,又调用另一个函数。 在程序中实现函数嵌套调用时,需要注意的是:在调用函数之前,需要对每一个被调用的函数作声明(除非定义在前...
  • #两个.cpp文件间如何进行各自函数调用
  • C++的成员函数分为静态函数、非静态函数和虚函数三种,在本系列文章中,多处提到static和non-static不影响对象占用的内存,而虚函数需要引入虚指针,所以需要调整对象的内存布局。...本质上,这两个函数
  • C++两个相互调用

    千次阅读 2017-12-06 16:50:34
    C++两个相互调用
  • C/C++函数调用的几种方式总结

    千次阅读 2021-10-07 10:44:49
    但是,当高级语言被编译成计算机可以识别的机器码时,有一个问题就凸现出来:在CPU中,计算机没有办法知道一个函数调用需要多少个、什么样的参数,也没有硬件可以保存这些参数。也就是说,计算机不知道怎么给这个...
  • C++:构造函数调用函数

    千次阅读 2020-01-08 20:25:33
    来源:牛客网 class A ... virtual void func() { std::cout‘ ’;...如果构造函数调用虚函数的话,基类的构造函数调用基类的虚函数...如果派生类里面有两个同样的非虚函数,使用基类指针调用的话会调用基类的函数。
  • 内部函数是指一个函数只能被本文件中其他函数所调用,在定义内部函数时,在函数名和函数类型的前面加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++代码...
  • 只有在其它模块调用动态链接库中的函数时,它才发挥作用。Windows API中的所有函数都包含在DLL中。其中有3重要的DLL,Kernel32.dll,它包含用于管理内存、进程和线程的各个函数;User32.dll,它包含用于执行用户...
  • 在继承之外,在C++中一类成员函数调用另一类成员的方法主要有:类的组合,友元类,类的前向声明,单例模式等,下面主要讲讲这4种方法的实现 方法1:利用类的组合 组合通俗来讲就是类B有类A的属性,如声明一...
  • 函数调用 函数定义后,并不能自动执行,必须通过函数调用来实现函数的功能。 函数调用,即控制执行某个函数。 C++中,主函数可以调用其它子函数,而其它函数之间也可以相互调用。 在本节中,我们将介绍一下内容: ...
  • C++ 两个包含类互相调用彼此的类成员变量和方法
  • c++ 类的互相调用的方法,是今天弄明白的,这里提供例子和说明给大家参考,从而告诉大家C++中类与类之间的关系,是不能烂用乱用的.希望能给大家启发.
  • C++ 类成员函数调用

    千次阅读 2019-04-21 22:39:49
    今天看了一篇写得很好的博客:类成员函数调用分析 看完后,有一些小的心得,大概是帮我理了一遍吧。...与静态成员变量和非静态成员变量不同的是:静态成员函数和非静态成员函数存放在代码区,这函数调用时把当...
  • C/C++文件中函数互相调用

    千次阅读 2012-10-17 10:42:21
    C/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++利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作。   对象的初始化和清理工作是...
  • 解压后是两个项目,一个c++DLL,一个c#控制台。C#调用c++函数的dll文件,同时实现c++调用c#函数,解决了错误,可以正常运行。如果有其他问题,可以互相讨论。
  • C++函数定义和调用过程(超详细)

    千次阅读 2021-05-22 08:33:53
    所有函数定义包括以下组成部分:名称:每个函数都必须有一个名称。通常,适用于变量名称的规则同样也适用于函数名称。形参列表:调用函数的程序模块可以向其发送数据。形参列表是保存传递给函数的值的变量列表。如果...
  • C 与 C++ 接口函数相互调用

    千次阅读 2018-12-24 11:48:45
    理解接口调用的关键在于理解函数名称在编译过程改编的原理和 extern &quot;C&quot; 的原理。
  • 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); }
  • http://blog.csdn.net/xiexingshishu/article/details/40679403http://it.zuocheng.net/c-cpp-mix-programe1、如何C++程序要调用 已编译后的C函数,该怎么办?(1)假设某个C函数的声明如下:void foo(int x, int y)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 596,783
精华内容 238,713
关键字:

c++两个函数相互调用

c++ 订阅