模板方法模式(大话设计模式)C/C++版本

模板方法模式

在这里插入图片描述

C++

#include <iostream>
using namespace std;

class TestPaper
{
public:
    void TestQ1()
    {
        cout << "杨过得到,后来给了郭靖,炼成倚天剑,屠龙刀的玄铁可能是[ ]\na.球磨铸铁 b.马口贴 c.高速合金钢 d.碳素纤维" << endl;
        cout << "答案: " << Answer1() << endl;
    }

    void TestQ2()
    {
        cout << "杨过、程英、陆无双铲除了情花,造成[ ]\na.使这种植物不再害人 b.使一种珍稀物种灭绝c.破坏了那个生物圈的生态平衡d.造成该地区沙漠化" << endl;
        cout << "答案: " << Answer2() << endl;
    }

    void TestQ3()
    {
        cout << "蓝凤凰致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,会给他们开什么药[ ]\na.阿司匹林b.牛黄解毒片c.氟哌酸d.让他们喝大量的生牛奶e.以上全不对" << endl;
        cout << "答案: " << Answer3() << endl;
    }

    virtual string Answer1()
    {
        return "null";
    }

    virtual string Answer2()
    {
        return "null";
    }

    virtual string Answer3()
    {
        return "null";
    }
};

class TestPaperA : public TestPaper
{
    string Answer1()
    {
        return "a";
    }

    string Answer2()
    {
        return "b";
    }

    string Answer3()
    {
        return "c";
    }
};

class TestPaperB : public TestPaper
{
    string Answer1()
    {
        return "a";
    }

    string Answer2()
    {
        return "a";
    }

    string Answer3()
    {
        return "a";
    }
};

int main()
{
    cout << "同学A答题情况: " << endl;
    TestPaper *A = new TestPaperA();
    A->TestQ1();
    A->TestQ2();
    A->TestQ3();
    cout << endl;

    cout << "同学B答题情况: " << endl;
    TestPaper *B = new TestPaperB();
    B->TestQ1();
    B->TestQ2();
    B->TestQ3();

    return 0;
}

C

#include <stdio.h>
#include <string.h>
typedef struct
{
    char question[256];
    char answer[256];
} Question;

typedef struct
{
    Question questions[3];
    char *(*getAnswer)(int questionIndex);
} TestPaperBase;

// 定义问题
Question g_questions[3] = {
    {"杨过得到,后来给了郭靖,炼成倚天剑,屠龙刀的玄铁可能是[ ]\na.球磨铸铁 b.马口贴 c.高速合金钢 d.碳素纤维", "null"},
    {"杨过、程英、陆无双铲除了情花,造成[ ]\na.使这种植物不再害人 b.使一种珍稀物种灭绝c.破坏了那个生物圈的生态平衡d.造成该地区沙漠化", "null"},
    {"蓝凤凰致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,会给他们开什么药[ ]\na.阿司匹林b.牛黄解毒片c.氟哌酸d.让他们喝大量的生牛奶e.以上全不对", "null"}
};

char *getAnswerA(int index)
{
    switch (index)
    {
    case 0:
        return "a";
    case 1:
        return "b";
    case 2:
        return "c";
    default:
        return "Invalid question index";
    }
}

char *getAnswerB(int index)
{
    switch (index)
    {
    case 0:
        return "a";
    case 1:
        return "a";
    case 2:
        return "a";
    default:
        return "Invalid question index";
    }
}

void TestQ(TestPaperBase *paper, int qIndex)
{
    strncpy(paper->questions[qIndex].answer, paper->getAnswer(qIndex), sizeof(paper->questions[qIndex].answer) - 1);

    printf("%s\n", paper->questions[qIndex].question);
    printf("答案:%s\n", paper->questions[qIndex].answer);
}

int main()
{
    TestPaperBase TestPaperA;
    memcpy(TestPaperA.questions, g_questions, sizeof(g_questions));
    TestPaperA.getAnswer = getAnswerA;

    printf("同学A答题情况:\n");
    TestQ(&TestPaperA, 0);
    TestQ(&TestPaperA, 1);
    TestQ(&TestPaperA, 2);
    printf("\n");

    TestPaperBase TestPaperB;
    memcpy(TestPaperB.questions, g_questions, sizeof(g_questions));
    TestPaperB.getAnswer = getAnswerB;
    
    printf("同学B答题情况:\n");
    TestQ(&TestPaperB, 0);
    TestQ(&TestPaperB, 1);
    TestQ(&TestPaperB, 2);

    return 0;
}

总结

设计基类的时候,最大程度上的去复用代码,尽可能的泛化。细节高层次的差别的地方可以virtual,要求子类重写。

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

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

相关文章

【国赛赛题详解】2024年数学建模国赛ABCDEF题(点个关注,后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的蓝色字体链接&#xff0c;那是获取资料的入口! 点击链接加入群聊【2024国赛资料合集】&#xff1a;http://qm.qq.com/cgi-bin/qm/qr?_wv1027&keQt5WRIvc5-fogZRrrahAhbqDa2nKfW8&authKey%2BqQfThTx…

[DDR4] 总目录 学习路线

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 传送门: 总目录 目录 基础篇 1-1 DDR4 发展历史 1-2 DDR4 和 DDR3 差异与优势 1-3 DDR4 内部结构 1-4 DDR4 工作原理 协议篇 2-1 DDR4 引脚 设计篇 实践篇 进阶篇 学习路线&#xff1a; 了解DDR4的基本知识…

如何训练自己的大型语言模型?

简介 大型语言模型&#xff0c;如OpenAI的GPT-4或Google的PaLM&#xff0c;已经席卷了人工智能领域。然而&#xff0c;大多数公司目前没有能力训练这些模型&#xff0c;并且完全依赖于只有少数几家大型科技公司提供技术支持。 在Replit&#xff0c;我们投入了大量资源来建立从…

ShardingSphere-proxy添加自定义分片规则(踩坑日记)

文章目录 一、新建spring boot项目二、编写代码(1) 新建一个类(2) doSharding方法详解(3) 实际例子 三、增加spi文件&#xff08;很关键&#xff09;四、打包五、把生成的文件放到ext-lib中六、yaml配置&#xff08;怎么用&#xff09;七、测试 版本环境 mysql 5.7.40 sharding…

在VMware中安装CentOS7(超详细的图文教程)

1、CentOS7的下载 官网下载地址&#xff1a;Download。 进入CentOS下载官网&#xff0c;找到64位的CentOS7版本。 点进来后&#xff0c;发现它给我们列出了所在区域可用镜像源&#xff08;可以说是非常的良心的&#xff09;&#xff0c;我们随便选择一个&#xff0c;这里以阿…

随笔-来了,安了

依照领导定的规矩&#xff0c;周五又去了分公司&#xff0c;赋能一线去了。到了地方就是开会->现场解决问题->干饭->开会过需求、提供解决方案&#xff0c;充实得厉害。强度也不小&#xff0c;中午干的一大碗饭&#xff0c;到五点就饿了。 六点带着分公司催着上线的需…

浔川身份证号码查询——浔川python科技社

Python获取身份证信息 公民身份号码是每个公民唯一的、终身不变的身份代码&#xff0c;由公安机关按照公民身份号码国家标准编制。每一个居民只能拥有一个唯一的身份证&#xff0c;它是用于证明持有人身份的一种法定证件。 身份证包含了个人的一些重要信息&#xff0c;比如&am…

「计算机网络」初识http协议

前言 HTTP协议——互联网发展的基石&#xff0c;从一个最简单的“helloworld”网页&#xff0c;到现在博客平台、视频网站都离不开HTTP协议的存在。随着互联网的发展&#xff0c;Web网页的设计也越发复杂&#xff0c;前后端开发的分工也越发明确&#xff0c;HTTP作为连接前后端…

conda添加镜像源与channels

文章目录 一、conda下添加国内镜像源&#xff08;window下&#xff09;二、pip配置国内镜像源&#xff08;window下&#xff0c;临时修改&#xff09;三、conda源的定义 一、conda下添加国内镜像源&#xff08;window下&#xff09; 1、为【channels】配置清华镜像通道 直接在…

英伟达开源 3400 亿巨兽:98% 合成数据训出最强开源通用模型,性能对标 GPT-4o

NVIDIA 最近开源了其大型语言模型 Nemotron-4 340B&#xff0c;这是一个具有划时代意义的模型&#xff0c;它使用了高达 98% 的合成数据进行训练&#xff0c;并且在性能上与 GPT-4 相当。Nemotron-4 340B 包括基础模型、指令模型和奖励模型&#xff0c;支持 4K 上下文窗口、50 …

配置完eslint没有用?

当你使用 npx eslint --init 生成配置文件后 你也配置好了.prettierrc 当你在代码写一点小问题的时候 发现eslint没有进行检查 原因是你生成的 .eslintrc.js中没有加上这个配置 extends: [.....plugin:prettier/recommended],加上以后重启vscode你会发现

BUUCTF---[MRCTF2020]你能看懂音符吗

1、下载附件&#xff0c;是一个压缩包&#xff0c;解压&#xff0c;发现解压失败 2、用winhex分析文件&#xff0c;发现文件头不对 3、将文件头改为&#xff1a;52617221&#xff0c;保存 4、解压得到word 5、在文档发现下面内容 6、根据题目的描述&#xff0c;将音乐字符解码…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 停车场车位统计(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 停车场车位统计(100分) 🌍 评测功能需要订阅专栏后私信联…

邮件钓鱼--前置-攻击防范 7 看

目录 1、什么是 SPF&#xff1a; 2、如何判断 SPF&#xff1a; 3.邮件钓鱼防范&#xff1a;7 看 1、什么是 SPF&#xff1a; SPF 记录&#xff1a;原理、语法及配置方法简介 (zhetao.com) SPF记录详解_spf写法-CSDN博客 发件人策略框架&#xff08;Sender Policy Frame…

Vue45-分析脚手架结构

一、脚手架项目结构一览 二、src、public文件夹外的文件 2-1、babel.config.js文件 详细的配置规格&#xff1a;babel官网。 2-2、package.json包的说明书 build命令&#xff1a;代码写完了&#xff0c;最后使用build命名构建整个工程&#xff0c;将其变成浏览器能够运行的项…

【数据结构】第十六弹---C语言实现希尔排序

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、希尔排序( 缩小增量排序 ) 1.1、预排序实现 1.2、希尔排序代码实现 1.3、代码测试 1.4、时空复杂度分析 1.5、性能比较 总结 上一弹我们…

统计信号处理基础 习题解答10-17

题目&#xff1a; 在选择不含信息的或者不假设任何先验知识的先验PDF时,我们需要从数据中得到最大的信息量。在这种方式下,数据是了解未知参数的主要贡献者。利用习题10.15的结果,这种方法可以通过选择使I最大的来实现。对于例10.1的高斯先验PDF,该如何选择和2使得 是不含信息…

玄机平台应急响应—MySQL应急

前言 这个是比较简单的&#xff0c;其实和MySQL没啥太大的关系&#xff0c;没涉及太多MySQL的知识。看一下它的flag要求吧。 flag1 它说黑客写入的shell&#xff0c;那我们就去它的网站目录去看看&#xff0c;果然有一个叫sh.php的文件。 flag1{ccfda79e-7aa1-4275-bc26-a61…

【深度学习】CICIDS 2019,入侵检测,SVM支持向量机,随机森林,DNN训练,混淆矩阵

文章目录 数据集介绍Python环境随机森林训练结果SVM支持向量机训练结果DNN训练结果所有代码下载 数据集介绍 下载&#xff1a;https://www.kaggle.com/datasets/tarundhamor/cicids-2019-dataset 数据个数&#xff1a; # 删除label中是WebDDoS的数据df df[df[Label] ! WebDD…

简单的心电图信号分割方法

代码很简单&#xff0c;很容易看懂。 import pandas as pdimport matplotlib.pyplot as plt #headers [Name, Age, Marks]df pd.read_csv(samples-folder/samples2.csv) dfdf.drop(0)dfdf.drop(1)# print(df) if(len(df.columns) 3): df.columns [sample interval, sig…