C++构造器设计模式

构造器模式可以简化复杂对象或一系列对象的构造过程,从而单独定义构成该复杂对象的各个组件的构建方法。

这篇文章只讲解较为简单的构造器的创建。创建一个构造器我们得了解如何实现流式调用以及如何关闭外界的访问权对构造函数的访问权限。

流式调用

所谓流式调用就是能实现在一行代码中连续调用多个函数的效果,具体效果如下:

Object obj;
obj.call("流").call("式").call("调").call("用");

而实现这种技术的方式很简单,就是让函数返回对象自身或者对象自身的指针,也就是*this或者this,具体实现如下:

class object {Object& call(string str) {// ...return *this;}
};

关闭构造函数访问权限

在构造器设计模式中,因为我们会提供专门的构造器供对象使用者创建对象,有时我们会不希望使用者跳过构造器直接使用构造函数构造,所以我们会选择将封闭构造函数。封闭构造函数的方式很简单,就是将构造函数设置为 protected 或者 private,如果你希望这个类未来可以被继承,那么就设置为 protected,否则可以设置为 private。由于对象封闭构造函数之后,构造器也无法创建该对象,我们需要给构造器一定的特权访问私有或保护的构造函数,我们需要将使用 friend class 构造器类设置为友元类。

构造器

假设我们存在下面的 Vec 类:

#include <string>
#include <vector>
#include <numeric>
#include <iostream>using namespace std;class Vec {vector<string> elements;
public:Vec& add_element(const string& element) {elements.emplace_back(element);return *this;}string str() {return accumulate(elements.begin(), elements.end(), string());}
};

这个类知识简单得封装了 elemnets 字符串容器对象,提供了流式调用填充容器的方法以及将容器对象转字符串的方法。我们会直接创建一个对象并使用它。

int main() {Vec vec;vec.add_element("流").add_element("式").add_element("调").add_element("用");cout << vec.str() << endl;
}

而使用构造器来创建会是怎样的呢?我们会在 Vec 类中提供一个静态方法 build 用于创建 Builder 类,然后将填充容器的工作交给 Builder 类,并在 Builder 类中提供转换函数,便于将 Builder 类隐式转换回为 Vec,那么我们的调用就会变成下面这样:

int main() {Vec vec = Vec::build().add_element("流").add_element("式").add_element("调").add_element("用");cout << vec.str() << endl;
}

这样看起来可能会有点造作,因为这个例子的构造比较简单并不能体现 Builder 的作用,但是简单的例子便于理解 Builder 的写法。下面我们具体介绍 Builder 的创建。

首先,我们需要修改 Vec 类,封闭构造函数的访问权限并提供静态方法用于构建 Builder:

class Vec {
public:vector<string> elements;// 静态方法返回 Builderstatic Builder& build();string str() {return accumulate(elements.begin(), elements.end(), string());}
protected:Vec() = default;// 友元 Builderfriend class Builder;
};//class Builder {
// ...
//}Builder& Vec::build() {Builder* builder = new Builder();return *builder;
}

然后是 Builder 类的构建:

class Builder {
public:Vec vec;// 转换函数operator Vec() const {return vec;}// 填充容器Builder& add_element(const string& element) {vec.elements.emplace_back(element);return *this;}
};

上面 Builder 类首先创建 Vec 类对象,然后提供 add_element 供用户填充 Vec 容器,最后使用 operator Vec() 将 Builder 隐式转换回 Vec 对象。

以上就是简单构造器模式的全部的实现了。

如果想要了解更复杂的构造器如何实现,可以查看 GitHub 仓库 GnCDesignPattern 的代码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】进程切换环境变量

目录 一.进程切换 1.进程特性 2.进程切换 1.进程切换的现象 2.如何实现 3.现实例子 2.环境变量 一.基本概念 二.常见环境变量 三.查询常见环境变量的方法 四.和环境变量相关的命令 五.环境变量表的组织方式 六.使用系统调用接口方式查询环境变量 1.getenv 2.反思 …

【简单讲解下TalkingData】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

Signac|成年小鼠大脑 单细胞ATAC分析(1)

引言 在本教程中&#xff0c;我们将探讨由10x Genomics公司提供的成年小鼠大脑细胞的单细胞ATAC-seq数据集。本教程中使用的所有相关文件均可在10x Genomics官方网站上获取。 本教程复现了之前在人类外周血单核细胞&#xff08;PBMC&#xff09;的Signac入门教程中执行的命令。…

100道大模型面试八股文

算法暑期实习机会快结束了&#xff0c;校招大考即将来袭。 当前就业环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;岗位在变少&#xff0c;要求还更高了。 最近&#xff0c;我们陆续整理了很多大厂的面试题&#xff0c;帮助球友解惑答疑和职业规划&#xff0c;分…

【Python报错】已解决ModuleNotFoundError: No Module Named ‘openyxl’

成功解决“ModuleNotFoundError: No Module Named ‘openyxl’”错误的全面指南 在Python编程中&#xff0c;遇到ModuleNotFoundError: No Module Named openyxl这样的错误通常意味着Python解释器无法找到名为openyxl的模块。然而&#xff0c;这里存在一个常见的拼写错误&#…

javascript中的flat和faltmap的区别

JavaScript 中的 flat 和 flatMap 是数组方法&#xff0c;它们用于处理嵌套数组&#xff08;即数组中的元素也是数组&#xff09;。下面是它们的区别&#xff1a; flat 方法: flat 方法用于将嵌套数组“展平”成一个新数组&#xff0c;但不会改变原始数组。它接受一个可选的深…

Anaconda 环境管理的一些特殊操作

在指定位置创建虚拟环境 第一步&#xff1a;在现有/your/paht/目录创建env_name的环境变量 conda create -p /your/paht/env_name python3.x第二步&#xff1a;通过一下命令发现环境变量没有名字&#xff1a; conda env list第三步&#xff1a;将/your/paht/ 加入到conda 的en…

资源描述框架的用途及实际应用解析

什么是RDF&#xff1f; RDF代表 资源描述框架 RDF是用于描述网络资源的框架 RDF旨在被计算机阅读和理解 RDF并非设计用于供人阅读 RDF以 XML 编写 示例 描述购物商品的属性&#xff0c;如价格和可用性描述网络活动的时间表描述网页的信息&#xff08;内容&#xff0c;作者&a…

使用 Nacos 在 C# (.NET Core) 应用程序中实现高效配置管理和服务发现

在分布式系统架构日益流行的今天&#xff0c;服务配置管理和发现成为了开发和运维团队面临的重大挑战。Nacos&#xff0c;作为阿里巴巴开源的一款强大的动态配置管理与服务发现平台&#xff0c;为解决这一难题提供了有效方案。本文将介绍如何在C# (.NET Core)应用程序中集成Nac…

springboot,配置类加载过程

加载过程 首先来看启动类&#xff0c;启动类上包含了SpringBootApplication注解 SpringBootApplication MapperScan("com.cskaoyan.mapper") public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);…

后端开发面经系列 --中望C++面经

中望C面经&#xff0c;全部内容&#xff01; 公众号&#xff1a;阿Q技术站 文章目录 中望C面经&#xff0c;全部内容&#xff01;一面 8.15 时长45min1、介绍项目相关2、gdb怎么调试的&#xff1f;打断点用什么指令&#xff1f;3、gcc的编译过程4、cmake添加头文件搜索路径用…

Werkzeug的Response

Werkzeug的Response Werkzeug是一个WSGI工具包&#xff0c;提供了一组工具用于开发基于WSGI的Python Web应用。它不仅仅是一个简单的库&#xff0c;还提供了许多方便的工具来处理HTTP请求和响应。本文将深入探讨Werkzeug中Response类的讲解。 官方文档链接 Werkzeug Respons…

大语言模型 (LLM) 窥探未来

随着2023年的岁月渐渐走向尾声&#xff0c;我们站在人工智能的前沿&#xff0c;回望大语言模型&#xff08;Large Language Models, LLM&#xff09;所走过的道路&#xff0c;同时也不禁展望未来。从初步尝试到成为人工智能领域的万千宠爱&#xff0c;一种又一种的技术突破&…

搜维尔科技:「案例」Faceware电影中面部动画的演变历程

面部动画是电影中角色表演的一个重要方面&#xff0c;尤其是在严重依赖电子动画、化妆效果和动作捕捉系统的奇幻电影中。在《龙与地下城&#xff1a;盗贼荣誉》电影中&#xff0c;龙裔角色的面部动画是一个复杂的系统&#xff0c;使该生物在大屏幕上栩栩如生。该系统依赖于一种…

超速解读多模态InternVL-Chat1.5 ,如何做到开源SOTA——非官方首发核心技巧版(待修订)

解读InternVL-chat1.5系列 最近并行是事情太杂乱了&#xff0c;静下心来看一看优秀的开源项目,但是AI技术迭代这么快&#xff0c;现在基本是同时看五、六个方向的技术架构和代码&#xff0c;哪个我都不想放&#xff0c;都想知道原理和代码细节&#xff0c;还要自己训练起来&am…

特征工程,减小过拟合

目录 特征工程 减小过拟合 图像增强方法 特征工程是机器学习和数据分析中不可或缺的一环,其重要性不言而喻。以下是关于特征工程的详细回答: 一、定义 特征工程是将原始数据转化为更好的表达问题本质的特征的过程,旨在发现对因变量y有明显影响作用的特征(通常称自变量…

Linux驱动开发笔记(四)设备树进阶及GPIO、Pinctrl子系统

文章目录 前言一、设备树的进阶知识1. 追加/修改节点内容2.chosen子节点3. 获取设备树节点信息3.1 of_find_node_by_path( )函数3.2 of_find_node_by_name( )函数3.3 of_find_node_by_type( )函数3.4 of_find_compatible_node( )函数3.5 of_find_matching_node_and_match( )函数…

Day30 登录界面设计

​ 本章节,实现了登录界面窗口设计 一.准备登录界面图片素材(透明背景图片) 把准备好的图片放在 Images 文件夹下面,格式分别是 .png和 .icoico 图片,右键属性,生成操作选 内容 png 图片,右键属性,生成操作选 资源 选中 login.png图片鼠标右键,选择属性。生成的操作选…

多目标应用:MOHHO多目标哈里斯鹰优化算法求解无人机三维路径规划(MATLAB代码)

详细介绍 多目标应用&#xff1a;MOHHO多目标哈里斯鹰优化算法求解无人机三维路径规划&#xff08;MATLAB代码&#xff09;-CSDN博客 一次运行结果 完整MATLAB代码

CentOS6系统因目录有隐含i权限属性致下属文件无法删除的故障一例

CentOS6服务器在升级openssh时因系统目录权限异常&#xff08;有隐含i权限属性&#xff09;&#xff0c;下属文件无法删除&#xff0c;导致系统问题的故障一例。 一、问题现象 CentOS6在升级openssh时&#xff0c;提示如下问题&#xff1a; warning: /etc/ssh/sshd_config c…