美文网首页
C++之多文件编程实战

C++之多文件编程实战

作者: 酵母小木 | 来源:发表于2019-06-23 21:40 被阅读0次

    转载:原文链接
    作为一个小白,我对于自己是无语的!菜的一批,写C++应该也有两年了,但是还不知道如何将一个单文件的长、臭项目重构为短、清晰的多文件项目。单文件项目里面十几个函数,看得我整个人都快崩溃了。

    一、基本结构

    从简单的多文件项目开始吧!通常分为三部分:main.cppaclass.cppaclass.h三个部分:

    • aclass.h
      • 函数原型
      • 使用#define或const定义的符号常量
      • 结构体声明
      • 类声明
      • 模板声明
      • 内联函数
    • aclass.cpp:包含与结构体、模板、类相关的函数代码
    • main.cpp:包含调用与结构体、模板、类相关的函数代码

    二、“”<>的区别

    • 包含自定义的头文件时,用双引号“”,编译器首先查找当前工作目录或源代码目录;如果没有找到,则将在标准位置查找。
    • 包含库的头文件时,用尖括号<>,编译器将查找存储标准头文件的主机系统的文件系统中查找。

    三、头文件使用ifndefdefineendif的解释

    由于在不知情的原因下,有可能将头文件包含多次,基于预处理器编译指令#ifndef(即if not define)可以避免这种情况 。

    #ifndef ACLASS_H_
    ...
    #endif
    
    上面这段代码意味着仅当之前没有使用预处理器编译指令#define定义名称ACLASS_H_时,才处理#ifndef#endif之间的语句。

    编译器首次遇到该文件时,名称ACLASS_H_没有定义(该名称根据头文件的名字取得,并加上一些下划线,使其在其他地方不太可能被定义),在这种情况下,编译器将查看#ifndef#endif之间的内容;如果在同一个文件中遇到其他包含aclass.h的内容,编译器就知道ACLASS_H_已经被定义了,从而跳到#endif后面的一行上。

    四、多文件案例实战

    Project
      --- Sources
      ------ coordin.cpp
      ------ main.cpp
      --- Headers
      ------ coordin.h
    

    main.cpp内容如下

    #include <iostream>
    #include "coordin.h"
    
    using namespace std;
    
    int main()
    {
        rect rplace;                    //直角坐标
        polar pplace;                   //极坐标
    
        cout << "Please Enter the x and y values: " << endl;
        while(cin >> rplace.x >> rplace.y)          //输入直角坐标
        {
            pplace = rect_to_polar(rplace);         //将直角坐标转化为极坐标
            show_polar(pplace);
            cout << "Next two numbers (q to quit): " << endl;
        }
        cout << "Bye." << endl;
        return 0;
    }
    

    coordin.cpp内容如下:

    #include <iostream>
    #include <cmath>
    #include "coordin.h"
    using namespace std;
    
    polar rect_to_polar(rect xypos)
    {
    
        polar answer;
    
        answer.distance = sqrt(xypos.x * xypos.x + xypos.y * xypos.y);
        answer.angle = atan2(xypos.y, xypos.x);
        return answer;
    }
    
    void show_polar(polar dapos)
    {
        const double Rad_to_deg = 57.29577951;
    
        cout << "distance = " << dapos.distance;
        cout << ", angle = " << dapos.angle * Rad_to_deg;
        cout << "  degrees\n";
    }
    

    coordin.h内容如下:

    #ifndef COORDIN_H_INCLUDED
    #define COORDIN_H_INCLUDED
    
    struct polar
    {
        double distance;
        double angle;
    };
    
    struct rect
    {
        double x;
        double y;
    };
    
    polar rect_to_polar(rect xypos);
    void show_polar(polar dapos);
    
    #endif // COORDIN_H_INCLUDED
    

    coordin.h中的声明和coordin.cpp函数实现会自动进行对应的链接,这是C++自身的属性功能,.h文件中函数声明,会自动触发编译器进行同名.cpp中对应函数实现的检索,如果没检索,则会报错提示没有具体实现。

    相关文章

      网友评论

          本文标题:C++之多文件编程实战

          本文链接:https://www.haomeiwen.com/subject/rlvwqctx.html