【数据结构实战C++】13 类族结构改进

2024-02-24 00:48

本文主要是介绍【数据结构实战C++】13 类族结构改进,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【数据结构实战C++】13 类族结构改进

作者 CodeAllen ,转载请注明出处


遵循经典设计准则
设计的KKlib中的所有类位于单一的继承树
在这里插入图片描述

如何通过编程改进
改进的关键点
-exception类继承自object类

  • 堆空间中创建异常对象失败的时候,返回NULL指针
    -新增InvalidOperationException异常类
  • 成员函数调用时,如果状态不正确则抛出异常
    -SmartPointer类继承自object类
  • 堆空间中创建智能指针对象失败时,返回NULL指针

实验1 类族结构的进化
将之前的SmartPointer.h改为继承自父类object

#include <iostream>
#include <Exception.h>
#include "Object.h"
#include "SmartPointer.h"
using namespace std;
using namespace KKLib;
int main()
{SmartPointer<int>* sp = new SmartPointer<int>(); //是一个模板,需要把指向的指针写出来delete sp;return 0;
}
#include <iostream>
#include <Exception.h>
#include "Object.h"
#include "SmartPointer.h"
using namespace std;
using namespace KKLib;
int main()
{InvalidOperationException* e = new InvalidOperationException();delete e;return 0;
}

从结果看,所有类都继承自父类 object

KKLib的开发方式和注意事项
-迭代开发

  • 每次开发完一个小目标,持续开发,最终打造可复用类库
    -单一继承树
  • 所有类都继承自object,规模堆对象创建时的行为
    -只抛异常,不处理异常
  • 使用THROW_EXCEPTION抛出异常,提高可移植性
    -弱耦合性
  • 尽量不适用标准库中的类和函数,提高可移植性

实验 : 可移植性测试(很多公司要求不能使用异常处理机制,不能用try … catch …)
#define THROW_EXCEPTION(e, m) //(throw e(m, FILE, LINE))

int main()
{cout << "main begin" <<endl;THROW_EXCEPTION(InvalidOperationException, "test");cout << "main() end" << endl;return 0;
}

改动之后会顺利执行,但是这行没有意义

这篇关于【数据结构实战C++】13 类族结构改进的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/740443

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c