《C++游戏编程入门》第8章 类:Critter Caretaker

《C++游戏编程入门》第8章 类:Critter Caretaker

    • 8.1 定义新类型
        • 08.simple_critter.cpp
    • 8.2 使用构造函数
        • 08.constructor_critter.cpp
    • 8.3 设置成员访问级别
        • 08.private_critter.cpp
    • 8.4 使用静态数据成员与静态成员函数
        • 08.static_critter.cpp
    • 8.5 Critter Caretaker游戏
        • 08.critter_caretaker.cpp

8.1 定义新类型

08.simple_critter.cpp
#include <iostream>
using namespace std;class Critter // 类定义,定义新类型Critter
{
public:int m_Hunger; // 声明数据成员void Greet(); // 声明成员函数
};void Critter::Greet() // 成员函数定义
{cout << "Hi. I'm a critter. My hunger level is " << m_Hunger << ".\n";
}int main()
{Critter crit1; // 对象实例化Critter crit2;crit1.m_Hunger = 9; // 对象操作cout << "crit1's hunger level is " << crit1.m_Hunger << ".\n";crit2.m_Hunger = 3;cout << "crit2's hunger level is " << crit2.m_Hunger << ".\n\n";crit1.Greet(); // 成员函数调用crit2.Greet();return 0;
}

8.2 使用构造函数

构造函数,实例化新对象时自动调用,通常初始化工作,给数据成员赋值。

08.constructor_critter.cpp
#include <iostream>
using namespace std;class Critter
{
public:int m_Hunger;Critter(int hunger = 0); // 声明构造函数,提供默认参数void Greet();
};Critter::Critter(int hunger) // 定义构造函数
{cout << "A new critter has been born!" << endl;m_Hunger = hunger;
}void Critter::Greet()
{cout << "Hi. I'm a critter. My hunger level is " << m_Hunger << ".\n\n";
}int main()
{Critter crit(7);crit.Greet();return 0;
}

8.3 设置成员访问级别

避免直接修改或访问对象的数据成员,让成员函数维护。

08.private_critter.cpp
#include <iostream>
using namespace std;class Critter
{
public: // begin public sectionCritter(int hunger = 0);int GetHunger() const;void SetHunger(int hunger);private: // begin private sectionint m_Hunger;
};Critter::Critter(int hunger): m_Hunger(hunger)
{cout << "A new critter has been born!" << endl;
}int Critter::GetHunger() const // const不能修改非静态数据成员值,不能调用非常量成员函数
{return m_Hunger;
}void Critter::SetHunger(int hunger)
{if (hunger < 0){cout << "You can't set a critter's hunger to a negative number.\n\n";}else{m_Hunger = hunger;}
}int main()
{Critter crit(5);// cout << crit.m_Hunger; -- illegal, m_Hunger is private!cout << "Calling GetHunger(): " << crit.GetHunger() << "\n\n";cout << "Calling SetHunger() with -1.\n";crit.SetHunger(-1);cout << "Calling SetHunger() with 9.\n";crit.SetHunger(9);cout << "Calling GetHunger(): " << crit.GetHunger() << "\n\n";return 0;
}

8.4 使用静态数据成员与静态成员函数

08.static_critter.cpp
#include <iostream>
using namespace std;class Critter
{
public:static int s_Total; // 静态成员变量声明// total number of Critter objects in existenceCritter(int hunger = 0);static int GetTotal(); // 静态成员函数声明private:int m_Hunger;
};int Critter::s_Total = 0; // 静态成员变量定义并初始化Critter::Critter(int hunger) : m_Hunger(hunger)
{cout << "A critter has been born!" << endl;++s_Total;
}int Critter::GetTotal() // 静态成员函数定义,不能访问非静态数据成员
{return s_Total;
}int main()
{cout << "The total number of critters is: ";cout << Critter::s_Total << "\n\n"; // 访问静态常用变量Critter crit1, crit2, crit3;cout << "\nThe total number of critters is: ";cout << Critter::GetTotal() << "\n"; // 调用静态成员函数return 0;
}

8.5 Critter Caretaker游戏

08.critter_caretaker.cpp
#include <iostream>
using namespace std;class Critter
{
public:Critter(int hunger = 0, int boredom = 0);void Talk();void Eat(int food = 4);void Play(int fun = 4);private:int m_Hunger;  // 饥饿程度int m_Boredom; // 厌倦程度int GetMood() const;void PassTime(int time = 1);
};Critter::Critter(int hunger, int boredom): m_Hunger(hunger), m_Boredom(boredom)
{
}inline int Critter::GetMood() const
{return (m_Hunger + m_Boredom);
}void Critter::PassTime(int time)
{m_Hunger += time;m_Boredom += time;
}void Critter::Talk()
{cout << "I'm a critter and I feel ";int mood = GetMood();if (mood > 15)cout << "mad.\n";else if (mood > 10)cout << "frustrated.\n";else if (mood > 5)cout << "okay.\n";elsecout << "happy.\n";PassTime();
}void Critter::Eat(int food)
{cout << "Brruppp.\n";m_Hunger -= food;if (m_Hunger < 0)m_Hunger = 0;PassTime();
}void Critter::Play(int fun)
{cout << "Wheee!\n";m_Boredom -= fun;if (m_Boredom < 0)m_Boredom = 0;PassTime();
}int main()
{Critter crit;crit.Talk();int choice;do{cout << "\nCritter Caretaker\n\n";cout << "0 - Quit\n";cout << "1 - Listen to your critter\n";cout << "2 - Feed your critter\n";cout << "3 - Play with your critter\n\n";cout << "Choice: ";cin >> choice;switch (choice){case 0:cout << "Good-bye.\n";break;case 1:crit.Talk();break;case 2:crit.Eat();break;case 3:crit.Play();break;default:cout << "\nSorry, but " << choice << " isn't a valid choice.\n";}} while (choice != 0);return 0;
}

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

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

相关文章

DAY by DAY 史上最全的Linux常用命令汇总----man

man是按照手册的章节号的顺序进行搜索的。 man设置了如下的功能键&#xff1a; 功能键 功能 空格键 显示手册页的下一屏 Enter键 一次滚动手册页的一行 b 回滚一屏 f 前滚一屏 q 退出man命令 h 列出所有功能键 /word 搜索word字符串 注意&#xff1a…

【文献阅读】A Fourier-based Framework for Domain Generalization(基于傅立叶的领域泛化框架)

原文地址&#xff1a;https://arxiv.org/abs/2105.11120 摘要 现代深度神经网络在测试数据和训练数据的不同分布下进行评估时&#xff0c;存在性能下降的问题。领域泛化旨在通过从多个源领域学习可转移的知识&#xff0c;从而泛化到未知的目标领域&#xff0c;从而解决这一问…

环境搭建SpringSecurity

一、maven依赖 <!-- Spring dependencies --> <dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version> </dependency><dependency><g…

03-自媒体文章发布-黑马头条

自媒体文章发布 1)自媒体前后端搭建 1.1)后台搭建 ①&#xff1a;资料中找到heima-leadnews-wemedia.zip解压 拷贝到heima-leadnews-service工程下&#xff0c;并指定子模块 执行leadnews-wemedia.sql脚本 添加对应的nacos配置 spring:datasource:driver-class-name: com…

代码随想录算法训练营Day58 | 739.每日温度、496.下一个更大元素 I

单调栈基础 什么时候使用单调栈&#xff1a;通常是一维数组&#xff0c;要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置&#xff0c;此时我们就要想到可以用单调栈了 单调栈的作用&#xff1a;使用栈来记录已经遍历过的元素 使用单调栈前需要明确两点&…

图解Diffusion扩散模型+代码

0、项目视频详解 视频教程见B站https://www.bilibili.com/video/BV1e8411a7mz 1、diffusion模型理论&#xff08;推导出损失函数&#xff09; 1.1、背景 随着人工智能在图像生成&#xff0c;文本生成以及多模态生成等领域的技术不断累积&#xff0c;如&#xff1a;生成对抗网…

SD-WAN技术如何保障网络的持续连接和稳定性

在当今数字化时代&#xff0c;企业对于网络的稳定性和持续连接性需求日益增加。SD-WAN作为一种新兴的网络解决方案&#xff0c;为企业提供了有效的方式来实现网络的持续连接和稳定性。本文将探讨SD-WAN技术如何保障网络的持续连接和稳定性。 1、多路径冗余技术 SD-WAN采用了多…

window.postMessage学习(问答式)

demo在文章末尾。 window.postMessage 1、有什么用&#xff1f; 答&#xff1a;可以安全地实现跨源通信。通常&#xff0c;对于两个不同页面的脚本&#xff0c;只有当执行它们的页面同源时&#xff0c;这两个脚本才能相互通信。 window.postMessage() 方法提供了一种受控机…

初识Python语言-课堂练习【pyhton123题库】

初识Python语言-课堂练习【pyhton123题库】 一、单项选择题 1、Guido van Rossum正式对外发布Python版本的年份是&#xff1a; A 2008B 1998C 1991D 2002 【答案】C 【解析】暂无解析2、下面不是Python语言特点的是&#xff1a;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪…

移动端App、小程序、公众号该怎么选择,你真得知道吗?

当下移动App,小程序泛滥&#xff0c;如何选择&#xff0c;你真的知道吗&#xff1f; 今天我们就聊聊App、小程序、公众号、微应用具体是什么&#xff1f;怎么样开发&#xff1f;适合在什么情况下使用&#xff1f; 1.App、小程序、公众号、微应用之初识 App App本质来说就是手…

机试:蛇形矩阵

问题描述: 代码示例: //蛇形矩阵 #include <bits/stdc.h> using namespace std;int main(){int n;cout << "输入样例" << endl; cin >> n;int k 1; for(int i 0; i < n; i){if( i %2 0){//单数行for(int j 0; j < n; j){ cout &…

native关键字的理解

native关键字的理解 使用native关键字说明这个方法是原生函数&#xff0c;也就是这个方法是用C/C等非Java语言实现的&#xff0c;并且被编译成了DLL&#xff0c;由Java去调用。 本地方法是有方法体的&#xff0c;用c语言编写。由于本地方法的方法体源码没有对我们开源&#xf…

7. Linux进程环境

进程是操作系统运行程序的一个实例,也是操作系统分配资源的单位。在Linux环境中,每个进程都有独立的进程空间,以便对不同的进程进行隔离,使之不会互相影响。深入理解Linux下的进程环境, 可以帮助我们写出更健壮的代码。 在 Linux 中,进程是程序的一次执行过程,它包含了程…

日常学习2024.03.12-js中的weakSet

日常学习2024.03.12-js中的weakSet 1.WeakSet是什么&#xff1f;2.WeakSet 使用弱引用&#xff0c;Set使用强引用 1.WeakSet是什么&#xff1f; weakSet是什么呢&#xff1f;刚开始自己确实也没什么印象&#xff0c;终结学习一下吧。 WeakSet 是可被垃圾回收的值的集合&#x…

安装包逆向1

1.找到程序的入口点 在IDA中我们看到函数非常多&#xff0c;但是一般都是有主要的入口的&#xff0c;所以找一下有没有主函数 可以直接 CtrF直接查找 CNsInstaller::CNsInstaller 这里搞半天在获取文件路径 CNsInstaller::StartInstall CNsInstaller::InstallFunc char…

springboot268码头船只货柜管理系统

码头船只出行和货柜管理系统的设计与实现 摘要 针对于码头船只货柜信息管理方面的不规范&#xff0c;容错率低&#xff0c;管理人员处理数据费工费时&#xff0c;采用新开发的码头船只货柜管理系统可以从根源上规范整个数据处理流程。 码头船只货柜管理系统能够实现货柜管理…

我和我的DBA之路

这几天&#xff0c;突然想写写这些年的工作总结&#xff0c;毕业至今快20年的回顾。 想到20年前&#xff0c;在做毕业设计的时候&#xff0c;当时是学的机械工程类专业&#xff0c;因为带毕业设计的老师兼职企业有个门户网站的需求&#xff0c;而我又会用DreamWeaver做点网站设…

你的 Python 为什么需要解释一下?

Python 是一种相对简单的编程语言&#xff1b;它主要以解释型语言著称&#xff0c;这意味着每行代码都要通过解释器逐行执行。不过在某些时候&#xff0c;将 Python 代码翻译成计算机可以理解的内容&#xff0c;然后再逐行执行&#xff0c;可以减少繁琐。 在这种情况下&#x…

Spring 面试题及答案整理,最新面试题

Spring框架中的Bean生命周期是什么&#xff1f; Spring框架中的Bean生命周期包含以下关键步骤&#xff1a; 1、实例化Bean&#xff1a; 首先创建Bean的实例。 2、设置属性值&#xff1a; Spring框架通过反射机制注入属性。 3、调用BeanNameAware的setBeanName()&#xff1a…

某电信公司组织结构优化咨询项目成功案例纪实

——构建前后端组织结构&#xff0c;提升组织运营效率 随着企业的不断发展&#xff0c;行业的竞争也越来越激烈&#xff0c;企业只能不断调整自身的战略才能更好的适应这样的大环境。在战略调整的过程中&#xff0c;企业往往会面临这样的问题&#xff1a;管理层的经营理念各不…