100个囚犯和灯泡C语言,求助大神:用C++ 面向对象方法解决100个囚犯1盏灯问题

本文主要是介绍100个囚犯和灯泡C语言,求助大神:用C++ 面向对象方法解决100个囚犯1盏灯问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

class Prisoner {

protected:

static bool s_bInitialized;

static bool s_bLight;

static Prisoner *m_arlpPrisoners[100];

bool m_bHasTurnedOnTheLight;

protected:

Prisoner() : m_bHasTurnedOnTheLight(false) { }

virtual ~Prisoner() { };

public:

static void Initialize();

virtual void Release();

};

class Counter : public Prisoner {

protected:

static Counter *s_lpcntrSingleton;

unsigned int m_uCount;

bool m_bHaveIBeenReleasedYet;

protected:

Counter() : m_uCount(0), m_bHaveIBeenReleasedYet(false) { }

virtual ~Counter() { };

public:

static Counter* CreateSingleton();

virtual void Release();

};

bool Prisoner::s_bInitialized = false;

bool Prisoner::s_bLight = false;

Prisoner *Prisoner::m_arlpPrisoners[100] = {};

Counter *Counter::s_lpcntrSingleton = nullptr;

void Prisoner::Initialize(){

s_bLight = false;

m_arlpPrisoners[0] = Counter::CreateSingleton();

for(unsigned int i = 1;i < 100;++i){

m_arlpPrisoners[i] = new Prisoner();

}

}

void Prisoner::Release(){

if(!this->m_bHasTurnedOnTheLight && !s_bLight){

s_bLight = true;

this->m_bHasTurnedOnTheLight = true;

}

}

Counter* Counter::CreateSingleton(){

if(s_lpcntrSingleton != nullptr){

return nullptr;

}

s_lpcntrSingleton = new Counter();

return s_lpcntrSingleton;

}

void Counter::Release(){

if(!this->m_bHaveIBeenReleasedYet){

this->m_bHaveIBeenReleasedYet = true;

++m_uCount;

}

if(Prisoner::s_bLight){

Prisoner::s_bLight = false;

++m_uCount;

}

}

int main(){

Prisoner::Initialize();

/* Add your code here... */

return 0;

}

完全没跑过

47436eb29969fd2baad1fcabbbd28acf.gif

这篇关于100个囚犯和灯泡C语言,求助大神:用C++ 面向对象方法解决100个囚犯1盏灯问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核