hpp文件的使用

提示:文章

文章目录

  • 前言
  • 一、背景
  • 二、过程
    • 2.1 编写代码
    • 2.3 问题探究
  • 总结

前言

前期疑问:
本文目标:


一、背景

最近突然看到hpp文件,查了百度也没有hpp文件怎么写的说明,自己就试着写了下,写成功了。

而且基于写hpp文件还串联了其他的知识点。下面整理一下测试代码

二、过程

2.1 编写代码

// main.cpp文件

#include <cstdio>
#include "hppTest.hpp"

void TestMemory(HppTest &hppTest)
{
    for (unsigned int i = 0; i < 1000; i++) {
        char* str = hppTest.hppTestGetStr();
        printf("%d, %s\n", i, str);
    }
}

void TestMemory2()
{
    for (unsigned int i = 0; i < 100; i++) {
        HppTest hppTest;
        char* str = hppTest.hppTestGetStr();
        printf("%d, %s\n", i, str);
    }
}

void TestCopyConstruct(HppTest& hppTest)
{
    /*
     * 报错Call to deleted constructor of 'HppTest'
     * 'HppTest' has been explicitly marked deleted here
     * 这边报错hppTest对象不能被拷贝构造。从报错语句跳转到类中,
     * 跳转到HppTest(const HppTest &x) = delete;语句,
     * 也验证了HppTest hppTest2 = hppTest;写法是调用拷贝构造函数,因为hppTest2还不存在
     */
    HppTest hppTest2 = hppTest;             //拷贝构造函数


    /*
     * 报错Overload resolution selected deleted operator '='
     * candidate function has been explicitly deleted
     * 根据错误跳转到HppTest& operator = (const HppTest &x) = delete;语句、
     * 也验证了hppTest3 = hppTest;是调用赋值构造函数
     */
    HppTest hppTest3;
    hppTest3 = hppTest;
}

int main()
{
    printf("hppTest\n");
    HppTest hppTest;
    int num = hppTest.hppTestFunc();
    printf("num: %d\n", num);

    // 构造内存泄露的情况,但是没有成功,原因是我的申请内存是在实例化对象的时候申请的,
    // 在for循环中并不会再次申请,同样就不会释放,for循环多少次都是一样的。修改成代码TestMemory2
    TestMemory(hppTest);

    // 在for循环中实例化对象,不断申请内存释放内存
    /*
     * 按照预期内存泄露,运行第6次就内存泄漏了。基于析构函数中delete被注释
     * terminate called after throwing an instance of 'std::bad_alloc'
     * what():  std::bad_alloc
     * 下面放开析构函数中的delete释放内存代码,再次验证
     * 执行1000次也没内存泄露,所以hpp中的析构函数有作用,析构函数中的delete释放内存有作用。
     */
    TestMemory2();

    TestCopyConstruct();

    return 0;
}

// HppTest.hpp文件

#ifndef TESTPROJ_LOCAL_WITHOUT_LIBRARY_HPPTEST_H
#define TESTPROJ_LOCAL_WITHOUT_LIBRARY_HPPTEST_H

#include <stdlib.h>
#include "string.h"

class HppTest {
public:
    HppTest() : num(16), array(nullptr)
    {
        //array = (char*)malloc(sizeof(char) * 15);
        array = new char[1500000000];
    }

    ~HppTest()
    {
        delete[] array;
        printf("array is released\n");
    }

    // 禁止复制构造函数
    HppTest(const HppTest &x) = delete;

    HppTest &operator=(const HppTest &x) = delete;

    int hppTestFunc()
    {
        return num;
    }

    char* hppTestGetStr()
    {
        memcpy(array, "hello world", sizeof(char) * 15);
        return array;
    }

private:
    int num;
    char* array;
};

#endif //TESTPROJ_LOCAL_WITHOUT_LIBRARY_HPPTEST_H


// 上述代码写的过程中遇到的几个问题
/*
 * 1、new申请空间的写法不知道
 * 2、在纠结hpp文件要不要写析构函数,答案是可以写的
 * 3、完全不知道怎么写拷贝构造函数和复制构造函数。
 * 4、照着自己写的文章写了拷贝构造函数和复制构造函数,写了=delete禁用,但是也写了花括号,报错了,正确的是写了=delete就不要写花括号了
 * 5、写禁止拷贝的原因是类中有指针。但是是否是这样还需要确认一下。
 * 6、想验证一下hpp文件的类的析构函数和内存释放是否有用描写了测试函数TestMemory和TestMemory2,从TestMemory函数到TestMemory2函数也加深了理解
 * 7、验证写了禁用拷贝、复制构造函数后,是否会禁用拷贝和赋值,经过TestCopyConstruct函数演这个,确实禁用了拷贝和赋值构造函数。
 * 8、c++初始化列表跟在构造函数后面,多个成员使用初始化李彪初始化时,使用【,】连接。
 */

// cmakelist.txt文件

include_directories(hppTest/HppTest.hpp)
add_executable(hppTest
        hppTest/main.cpp)

上述代码运行结果【前提要把TestCopyConstruct函数注释掉,因为调用了拷贝赋值构造函数】

hppTest
num: 16
0, hello world
1, hello world
2, hello world
...
...
998, hello world
999, hello world
0, hello world
array is released
1, hello world
array is released
2, hello world
array is released
...
...
98, hello world
array is released
99, hello world
array is released
array is released		

上面打印结果中最后一个array is released是因为释放main函数中的对象。

2.3 问题探究

// 上述代码写的过程中遇到的几个问题

/*

  • 1、new申请空间的写法不知道
  • 2、在纠结hpp文件要不要写析构函数,答案是可以写的
  • 3、完全不知道怎么写拷贝构造函数和复制构造函数。
  • 4、照着自己写的文章写了拷贝构造函数和复制构造函数,写了=delete禁用,但是也写了花括号,报错了,正确的是写了=delete就不要写花括号了
  • 5、写禁止拷贝的原因是类中有指针。但是是否是这样还需要确认一下。
  • 6、想验证一下hpp文件的类的析构函数和内存释放是否有用描写了测试函数TestMemory和TestMemory2,从TestMemory函数到TestMemory2函数也加深了理解
  • 7、验证写了禁用拷贝、复制构造函数后,是否会禁用拷贝和赋值,经过TestCopyConstruct函数演这个,确实禁用了拷贝和赋值构造函数。
  • 8、c++初始化列表跟在构造函数后面,多个成员使用初始化李彪初始化时,使用【,】连接。
    */

针对这个hpp文件的写法又收获了一波啊


总结

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/909795.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3父传子

1. App.vue - 父组件 咱们先来看左边的 App.vue&#xff0c;它扮演的是“父亲”角色——你可以想象它是一位热心的老爸&#xff0c;手里拿着一条消息&#xff0c;正准备把这条消息送到“儿子”那里。 <script setup> // 这个 setup 就像一个神奇的开关&#xff0c;一开…

前端 算法 双指针

文章目录 三数之和移动零盛最多水的容器接雨水 三数之和 leetcode 三数之和 题目链接 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有…

EPSON机械手与第三方相机的校准功能设计By python

EPSON机械手与第三方相机的校准功能设计By python 使用Python来实现EPSON机械手与第三方相机的校准功能是一个复杂但可行的任务。这通常涉及以下几个步骤:硬件接口通信、图像处理、标定算法实现和控制逻辑编写。 1. 环境准备 首先,库 pip install numpy opencv-python pyse…

NPU 可不可以代替 GPU

结论 先说结论&#xff0c;GPU分为可以做图形处理的传统意义上的真GPU&#xff0c;做HPC计算的GPGPU和做AI加速计算的GPGPU&#xff0c;所以下面分别说&#xff1a; 对于做图形处理的GPU&#xff0c;这个就和NPU 一样&#xff0c;属于DSA&#xff0c;没有替代性。当然&#xf…

python画图|hist()函数画直方图进阶

【1】引言 前序已经学习了hist()函数画直方图的基础教程&#xff0c;相关文章见下述链接&#xff1a; python画图|hist()函数画直方图初探-CSDN博客 在这里我们初步认识了hist()函数&#xff0c;并使用该函数画出了8个直方图。 之后又用bar(&#xff09;函数进行对比&#…

推荐一款非常好用的C/C++在线编译器

C/C作为一门底层、高效的编程语言&#xff0c;广泛应用于系统开发、游戏引擎、嵌入式系统等领域。然而&#xff0c;C/C的开发环境配置会让开发者把部分时间消耗在这件事上&#xff0c;也经常会遇到各种各样的环境问题。 本地开发的痛点 环境配置复杂&#xff1a;C/C的开发环境…

kafka如何获取 topic 主题的列表?

大家好&#xff0c;我是锋哥。今天分享关于【kafka如何获取 topic 主题的列表&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka如何获取 topic 主题的列表&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Kafka中&#xff0c;可以…

用示例来看C2Rust工具的使用和功能介绍

C2Rust可以将C语言的源代码转换成Rust语言的源代码。下面是一个简单的C语言代码示例&#xff0c;以及使用c2Rust工具将其转换为Rust安全代码的过程。 C语言源代码示例 // example.c #include <stdio.h>int add(int a, int b) {return a b; }int main() {int result a…

数据结构排序之直接选择排序--堆排序

堆排序 堆排序 (Heapsort) 是指利用堆积树&#xff08;堆&#xff09;这种数据结构所设计的一种排序算法&#xff0c;它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆&#xff0c;排降序建小堆。 直接选择排序的特性总结&#xff1a; 1. 堆排序使…

使用DJL和PaddlePaddle的口罩检测详细指南

使用DJL和PaddlePaddle的口罩检测详细指南 完整代码 该项目利用DJL和PaddlePaddle的预训练模型&#xff0c;构建了一个口罩检测应用程序。该应用能够在图片中检测人脸&#xff0c;并将每张人脸分类为“戴口罩”或“未戴口罩”。我们将深入分析代码的每个部分&#xff0c;以便…

【go从零单排】go三种结构体:for循环、if-else、switch

Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 for循环是go语言唯一的循环语句&#xff0c;没错&#xff0c;在go中再也不会看到while true package mainimport …

python怎么去掉换行符

换行符与其他字符并没有区别&#xff0c;由于换行符总是最后一个字符&#xff0c;所以直接选择除去最后一个字符的所有字符即可。 x abc\n x[:-1] 也可以使用字符串的strip()方法 但是strip()方法除了会去掉换行符&#xff0c;还会去掉空格等其他字符。 x.strip()

集中管理用户名和密码,定期修改密码快捷方便

在运维工作中&#xff0c;凭证管理是一项至关重要的任务。随着系统复杂性的增加和安全性要求的提高&#xff0c;如何有效地管理用户名和密码成为了运维团队面临的一大挑战。本文将介绍新版本中的凭证管理功能&#xff0c;并探讨其在运维行业中的应用和最佳实践。 一、凭证管理…

十年码农的编程心得分享

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Elasticsearch中时间字段格式用法详解

Elasticsearch中时间字段格式用法详解 攻城狮Jozz关注IP属地: 北京 2024.03.18 16:27:51字数 758阅读 2,571 Elasticsearch&#xff08;简称ES&#xff09;是一个基于Lucene构建的开源、分布式、RESTful搜索引擎。它提供了全文搜索、结构化搜索以及分析等功能&#xff0c;广泛…

【研究报告】2024年中国工业大模型行业发展研究报告

需要行业报告PDF的朋友请点击下方免费获取 报告聚焦于中国工业大模型的发展现状&#xff0c;详细分析了其在工业领域的应用与前景。工业大模型借助人工智能技术优化了制造流程、提升了生产效率&#xff0c;尤其在能源、制造、自动化等领域取得了显著成果。报告指出&#xff0c…

PLC单键启停控制的多种写法

题目&#xff1a;编写程序&#xff0c;实现当按下SB1按钮奇数次&#xff0c;灯亮&#xff1b;当按下SB1按钮偶数次&#xff0c;灯灭&#xff0c;即单键启停控制&#xff0c;设计梯形图。 解法一&#xff1a;使用标志位进行自锁互锁 &#xff08;1&#xff09;刚上电&#xff0c…

vit及其变体(swin Deit)

参考&#xff1a;https://www.zhihu.com/question/538049269/answer/2773898603 ViT模型变体&#xff1a;DeiT模型&#xff08;Data-Efficient Image Transformer&#xff09;&#xff1b;Swin Transformer模型 &#xff08;Shifted Windows Transformer&#xff09;&#xff1…

盲盒潮玩小程序,盲盒市场的巨大商业机遇!

近几年&#xff0c;盲盒展现出了强劲的发展态势&#xff0c;成为了消费者热衷的娱乐消费方式&#xff0c;各种大热IP在市场中大放异彩&#xff01;在网络中&#xff0c;关于盲盒的讨论度更是持续火热&#xff0c;显而易见&#xff0c;盲盒成为了一个不容小觑的行业&#xff01;…

聊一聊Elasticsearch的索引的分片分配机制

1、什么是分片分配 分片分配是由ES主节点将索引分片移动到ES集群中各个节点上的过程。 该过程尽量保证&#xff0c;同一个索引的分片尽量分配到更多的节点上&#xff0c;以此来达到读写索引的时候可以利用更多硬件资源的效果。 在分配过程当中&#xff0c;也不能将某个主分片…