• 【C++】类的声明 与 类的实现 分开 ② ( 头文件导入多次报错 | 头文件的作用 | 类的声明 | 类的实现 | 代码示例 - 类的使用 )






    一、头文件导入多次报错




    1、头文件没有 #pragma once 报错


    在 .cpp 源码文件中 , 使用 #include "Student.h" 代码 , 包含头文件 ,

    使用

    #include "Student.h"
    #include "Student.h"
    
    • 1
    • 2

    代码 的作用 , 相当于将 Student.h 头文件中的所有内容 , 拷贝了 2 次 ,

    其效果类等同于 :

    class Student
    {
    };
    class Student
    {
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    编译时会报如下 " “Student”:“class”类型重定义 " 错误 :

    1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
    1>Student.cpp
    1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Student.h(15,1): error C2011: “Student”:class”类型重定义
    1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Student.h(14): message : 参见“Student”的声明
    1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
    ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0==========
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述


    2、头文件加上 #pragma once 编译成功


    在头文件中 , 加上了 #pragma once 代码 , 即使在代码中 , 导入了 2 次头文件 , 也可以正常编译 , 不会报错 ;

    #include "Student.h"
    #include "Student.h"
    
    • 1
    • 2

    在这里插入图片描述





    二、头文件的作用



    在 .h 头文件中 , 只是对 变量 / 类 / 函数 , 进行声明 , 不实现它们 ;

    导入 .h 头文件 的 作用是可以访问这些 变量 / 类 / 函数 的 声明 ;


    在 实际 开发中 , 有两种情况下是需要导入 .h 头文件 的 :

    • 以 实现 声明的 变量 / 类 / 函数 为目的 , 自己开发函数库 给别人用 ;
    • 以 使用 声明的 变量 / 类 / 函数 为目的 , 使用别人开发的函数库 , 导入了头文件 , 即可访问头文件中声明的 变量 / 类 / 函数 ;




    三、类的声明



    在 Student.h 头文件中 , 定义 class Student 类 , 只声明该类 , 以及类的 成员属性 和 成员函数 ;

    不实现 成员函数 ;

    成员函数 在 对应的 Student.cpp 中实现 ;


    代码示例 :

    // 确保 该头文件 只包含一次
    #pragma once
    
    /*
    // C 语言中可使用如下宏定义确保 头文件 只被包含一次
    #ifndef Student_H
    #define Student_H
    
    // 源码主要内容
    
    #endif // !Student_H
    */
    
    class Student
    {
    private:
    	int age;
    	char name[64];
    
    public:
    	void setAge(int age);
    	int getAge();
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23




    四、类的实现



    在 Student.cpp 源码中 , 导入 Student.h 头文件 , 这是 创建 Student 类时自动生成的 ;

    在类中声明成员函数 void setAge(int age); , 如果没有实现该成员函数 , 鼠标移动上去后 , 会报如下错误 ;

    在这里插入图片描述
    使用 Alt + 回车 快捷键 , 会给出修改提示 :

    在这里插入图片描述

    选第一个选项 , 即可在 Student.cpp 中生成实现该函数的代码 ;

    在这里插入图片描述
    声明的 函数 ,

    	void setAge(int age);
    	int getAge();
    
    • 1
    • 2

    对应的 Student.cpp 中的方法如下 :

    void Student::setAge(int age)
    {
    	m_age = age;
    }
    
    int Student::getAge()
    {
    	return m_age;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在 void Student::setAge(int age) 方法中 , 可以直接访问 Student 中的成员 , 使用 域作用符 等同于 类内部的环境 ;





    五、代码示例 - 类的使用



    首先 , 导入 Student.h 头文件 , 其中声明了类 , 可以直接使用类 ;

    // 导入自定义类
    #include "Student.h"
    
    • 1
    • 2

    然后 , 直接在 main 函数中使用 Student 类即可 ; 先声明类 , 为类成员赋值 , 然后打印类的成员 ;

        Student s;
        s.setAge(18);
        cout<< s.getAge() << endl;
    
    • 1
    • 2
    • 3

    main 入口程序代码

    代码示例 :

    // 导入标准 io 流头文件 其中定义了 std 命名空间
    #include 
    // 导入 std 命名空间
    using namespace std;
    
    // 导入自定义类
    #include "Student.h"
    
    int main() {
        Student s;
        s.setAge(18);
        cout<< s.getAge() << endl;
        
    
        // 控制台暂停
        system("pause");
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    执行结果 :

    在这里插入图片描述

    头文件代码

    // 确保 该头文件 只包含一次
    #pragma once
    
    /*
    // C 语言中可使用如下宏定义确保 头文件 只被包含一次
    #ifndef Student_H
    #define Student_H
    
    // 源码主要内容
    
    #endif // !Student_H
    */
    
    class Student
    {
    private:
    	int m_age;
    	char m_name[64];
    
    public:
    	void setAge(int age);
    	int getAge();
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    类实现代码

    #include "Student.h"
    
    void Student::setAge(int age)
    {
    	m_age = age;
    }
    
    int Student::getAge()
    {
    	return m_age;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    微擎模块 志汇超级外卖餐饮小程序 V5.8.0后台模块+前端小程序
    要是你想使用异步队列的话,那就试试Reactor Flux吧!
    Air Quality Index,简称AQI
    西部数码云快照立大功-助力众多用户解决勒索病毒危机!
    【数字测图原理与方法】第三章水准测量原理和仪器
    Ubuntu Qt 5.15.2 支持 aarch64
    leecode#Excel表列名称#多数元素
    生成器建造者模式(Builder)——创建型模式
    【C++】二叉搜索树
    python 读取文件, 转化为 json 格式, 获取 json 中某个属性的值
  • 原文地址:https://blog.csdn.net/han1202012/article/details/132782820