VC++/MFC自己封装好的一个访问数据库的类

简介:

这个类是我在做一个小实验时写的,由于很少使用VC++,所以做出来的类可能不太好,如何有什么意义或者建议,请留言!谢谢!

#pragma once

//
// 头文件声明--Ado.h
// 提供数据库访问操作的类的声明部分
// 开发者:  黄仪标
// 开发日期:2013年4月13日 
//

//
// 必须添加这个,才能引入这些库函数
#import "E:\Program Files\common files\system\ado\msado15.dll" \
	     no_namespace rename("EOF","AdoEOF") rename("BOF","AdoBOF")

//			 
// 类的声明
class CAdo
{
	// 私有成员变量

private:
	// 执行T-SQL语句的命令对象指针
	_CommandPtr m_pCmd;

	// 连接数据库的连接对象指针
	_ConnectionPtr m_pConn;

	// 数据结果集对象指针
	_RecordsetPtr m_pRecordset;

	// 数据库连接字符串
	CString m_szConnectionString;

	// 记录出错信息
	CString m_szErrorMsg;


	// 公有成员函数
public:
	//
	// 默认构造函数
	// 初始化数据库连接字符串
	CAdo(void);

	//
	// 虚构造函数
	// 释放内存
	virtual ~CAdo(void);

	/******************************************************************************
	*函数名:   CreateConnection
	*功能描述: 创建数据库连接对象
	*前置条件: 数据库连接对象不存在
	*后置条件: 创建完成一个数据库连接对象
	*返回值:   TRUE--创建数据库连接对象成功
	*           FALSE--创建数据库连接对象失败
	*******************************************************************************/
	bool CreateConnection();

	/******************************************************************************
	*函数名:   CreateCommand
	*功能描述: 创建数据库命令对象
	*前置条件: 数据库命令对象不存在
	*后置条件: 创建完成一个数据库命令对象
	*返回值:   TRUE--创建数据库命令对象成功
	*           FALSE--创建数据库命令对象失败
	*******************************************************************************/
	bool CreateCommand();

	/******************************************************************************
	*函数名:   CreateRecordset
	*功能描述: 创建结果集对象
	*前置条件: 结果集对象不存在
	*后置条件: 创建完成一个结果集对象
	*返回值:   TRUE--创建结果集对象成功
	*           FALSE--创建结果集对象失败
	*******************************************************************************/
	bool CreateRecordset();

	/******************************************************************************
	*函数名:   OpenConnection
	*功能描述: 打开数据库
	*前置条件: 数据库连接对象不为空
	*后置条件: 打开数据库以提供后续操作
	*返回值:   TRUE--打开数据库成功
	*           FALSE--打开数据库失败
	*******************************************************************************/
	bool OpenConnection();

	/******************************************************************************
	*函数名:   CloseConnection
	*功能描述: 关闭数据库
	*前置条件: 数据库连接对象不为空
	*后置条件: 关闭数据库以提供后续操作
	*返回值:   TRUE--关闭数据库成功
	*           FALSE--关闭数据库失败
	*******************************************************************************/
	bool CloseConnection();

	/******************************************************************************
	*函数名:   OpenRecordset
	*功能描述: 打开结果集对象
	*前置条件: 数据库结果集对象不为空
	*后置条件: 打开结果集对象以提供后续操作
	*参数:     T-SQL语句
	*返回值:   TRUE--打开结果集对象成功
	*           FALSE--打开结果集对象失败
	*******************************************************************************/
	bool OpenRecordset(CString szSQL);

	/******************************************************************************
	*函数名:   CloseRecordset
	*功能描述: 关闭结果集对象
	*前置条件: 结果集对象不为空
	*后置条件: 关闭结果集对象以提供后续操作
	*返回值:   TRUE--关闭结果集对象成功
	*           FALSE--关闭结果集对象失败
	*******************************************************************************/
	bool CloseRecordset();

	/******************************************************************************
	*函数名:   IsConnected
	*功能描述: 判断数据库连接是否已经连接
	*前置条件: 数据库连接对象已经存在
	*后置条件: 返回连接对象的连接状态真假值
	*返回值:   TRUE--数据库连接对象已经处于连接状态
	*           FALSE--数据库连接对象已经不处于连接状态
	*******************************************************************************/
	bool IsConnected();

	/******************************************************************************
	*函数名:   IsRecordsetOpened
	*功能描述: 判断数据库结果集对象是否已经打开
	*前置条件: 数据库结果集对象已经存在
	*后置条件: 返回结果集对象的连接状态真假值
	*返回值:   TRUE--数据库结果集对象已经处于连接状态
	*           FALSE--数据库结果集对象已经不处于连接状态
	*******************************************************************************/
	bool IsRecordsetOpened();

	/******************************************************************************
	*函数名:   IsEndRecordset
	*功能描述: 判断数据库结果集对象是否已经到达末尾
	*前置条件: 数据库结果集对象已经存在
	*后置条件: 返回结果集对象是否到达末尾真假值
	*返回值:   TRUE--数据库结果集对象已经到达末尾
	*           FALSE--数据库结果集对象还没有到达末尾
	*******************************************************************************/
	bool IsEndRecordset();

	/******************************************************************************
	*函数名:   MoveToNext
	*功能描述: 移到到下一行
	*前置条件: 数据库结果集有数据
	*后置条件: 游标移到下一行
	*******************************************************************************/
	void MoveToNext();

	/******************************************************************************
	*函数名:   MoveToPrevious
	*功能描述: 移到到上一行
	*前置条件: 数据库结果集有数据
	*后置条件: 游标移到上一行
	*******************************************************************************/
	void MoveToPrevious();

	/******************************************************************************
	*函数名:   MoveToFirst
	*功能描述: 游标移到首行
	*前置条件: 数据库结果集有数据
	*后置条件: 将游标移到首行
	*******************************************************************************/
	void MoveToFirst();

	/******************************************************************************
	*函数名:   MoveToLast
	*功能描述: 游标移到最后一行
	*前置条件: 数据库结果集有数据
	*后置条件: 将游标移到结果集最后一行
	*******************************************************************************/
	void MoveToLast();

	/******************************************************************************
	*函数名:   GetRecordCount
	*功能描述: 判断数据库结果集中记录的条数
	*前置条件: 数据库结果集对象已经存在
	*后置条件: 返回结果集记录的条数
	*返回值:   long类型--记录的条数
	*******************************************************************************/
	long GetRecordCount();

	/******************************************************************************
	*函数名:   ExecuteByConnection
	*功能描述: 执行增、删、改操作
	*前置条件: 数据库已经连接上
	*后置条件: 返回受影响的行数
	*返回值:   TRUE--操作成功
	*           FALSE-操作失败
	*参数:     T-SQL语句:szSQL:CString类型
	*******************************************************************************/
	bool ExecuteByConnection(CString szSQL);

	/******************************************************************************
	*函数名:   GetErrorMsg
	*功能描述: 获取出错的信息
	*后置条件: 返回出错信息
	*返回值:   出错的信息--类型:CString
	*******************************************************************************/
	CString GetErrorMsg();

	/******************************************************************************
	*函数名:   GetFieldValue
	*功能描述: 获取字段值
	*前置条件: 结果集有数据
	*后置条件: 返回指定的字段的值
	*返回值:   TRUE--获取到字段的值
	*           FALSE-获取不到字段的值
	*参数:     pFieldName : cahr *类型--标识字段名
	*           strValue: CString类型--标识指定的字段的值
	*******************************************************************************/
	bool GetFieldValue(char * pFieldName, CString& strValue);

	/******************************************************************************
	*函数名:   IsFieldValueHasExisted
	*功能描述: 判断指定的字段值是否已在存在
	*返回值:   TRUE--指定的字段的值已经存在
	*           FALSE-指定的字段的值不存在
	*参数:     pFieldName : cahr *类型--标识字段名
	*           strValue: CString类型--标识指定的字段的值
	*******************************************************************************/
	bool IsFieldValueHasExisted(char * pFieldName, CString& strValue);
};

#include <stdio.h>
#include <stdio.h>
#include <malloc.h>

#include "StdAfx.h"
#include "Ado.h"

//
// Ado.h头文件的实现部分
//

//
// 默认构造函数
// 初始化数据库连接字符串
// 初始化OLE库
CAdo::CAdo(void)
{
	m_szErrorMsg = "";

	// 默认数据库连接字符串
	m_szConnectionString = "Provider=SQLOLEDB.1;Password=tianshi520;Persist Security Info=True;User ID=sa; \
						    Initial Catalog=DbSencondExperiment;Data Source=标哥-PC\\SQL2005"; 

	// 初始化OLE库
	CoInitialize(NULL);

	// 创建命令对象
	CreateCommand();

	// 创建连接对象
	CreateConnection();
	
	// 创建结果集对象
	CreateRecordset();
}

//
// 析构函数
//
CAdo::~CAdo(void)
{	
	// 执行清理内存工作
	CloseConnection();
	CloseRecordset();

	if (m_pCmd)  
	{
		m_pCmd.Release();
	}

	if (m_pRecordset)
	{
		m_pRecordset.Release();
	}

	if (m_pConn)
	{
		m_pConn.Release();
	}	
}

/******************************************************************************
*函数名:   CreateConnection
*功能描述: 创建数据库连接对象
*前置条件: 数据库连接对象不存在
*后置条件: 创建完成一个数据库连接对象
*返回值:   TRUE--创建数据库连接对象成功
*           FALSE--创建数据库连接对象失败
*******************************************************************************/
bool CAdo::CreateConnection()
{
	// 如果创建失败,则返回FALSE
	if (FAILED(m_pConn.CreateInstance(__uuidof(Connection))))
	{
		return FALSE;
	}

	return TRUE;
}

/******************************************************************************
*函数名:   CreateCommand
*功能描述: 创建数据库命令对象
*前置条件: 数据库命令对象不存在
*后置条件: 创建完成一个数据库命令对象
*返回值:   TRUE--创建数据库命令对象成功
*           FALSE--创建数据库命令对象失败
*******************************************************************************/
bool CAdo::CreateCommand()
{
	if (FAILED(m_pCmd.CreateInstance(__uuidof(Command))))
	{
		return FALSE;
	}

	return TRUE;
}

/******************************************************************************
*函数名:   CreateRecordset
*功能描述: 创建结果集对象
*前置条件: 结果集对象不存在
*后置条件: 创建完成一个结果集对象
*返回值:   TRUE--创建结果集对象成功
*           FALSE--创建结果集对象失败
*******************************************************************************/
bool CAdo::CreateRecordset()
{
	if (FAILED(m_pRecordset.CreateInstance(__uuidof(Recordset))))
	{
		return FALSE;
	}

	return TRUE;
}

/******************************************************************************
*函数名:   OpenConnection
*功能描述: 打开数据库
*前置条件: 数据库连接对象不为空
*后置条件: 打开数据库以提供后续操作
*返回值:   TRUE--打开数据库成功
*           FALSE--打开数据库失败
*******************************************************************************/
bool CAdo::OpenConnection()
{
	try
	{
		// 关闭当前连接对象
		CloseConnection();

		// 用FAILED来测试,不能用!来测试
		if (FAILED(m_pConn->Open(_bstr_t(m_szConnectionString), "", "", adModeUnknown)))
		{
			return FALSE;
		}
        
		if (FAILED(CreateCommand()))
		{
			return FALSE;
		}

		m_pConn->CursorLocation = adUseClient;
		m_pCmd->ActiveConnection = m_pConn;

		return TRUE;
	}
	catch (_com_error &e)
	{
		m_szErrorMsg = e.ErrorMessage();
		return FALSE;
	}
}


/******************************************************************************
*函数名:   CloseConnection
*功能描述: 关闭数据库
*前置条件: 数据库连接对象不为空
*后置条件: 关闭数据库以提供后续操作
*返回值:   TRUE--关闭数据库成功
*           FALSE--关闭数据库失败
*******************************************************************************/
bool CAdo::CloseConnection()
{
	try	
	{
		// 关闭结果集
		CloseRecordset();

		// 关闭连接对象
		if (m_pConn != NULL && m_pConn->GetState() != adStateClosed)
		{
			m_pConn->Close();
		}

		return true;	
	}
	catch(_com_error& e)	
	{
		m_szErrorMsg = e.ErrorMessage();
		return false;
	}	
}

/******************************************************************************
*函数名:   CloseRecordset
*功能描述: 关闭结果集对象
*前置条件: 结果集对象不为空
*后置条件: 关闭结果集对象以提供后续操作
*返回值:   TRUE--关闭结果集对象成功
*           FALSE--关闭结果集对象失败
*******************************************************************************/
bool CAdo::CloseRecordset()
{
	try
	{		
		if(IsRecordsetOpened())
			m_pRecordset->Close();	
		return true;		
	}
	catch(_com_error& e)
	{		
		m_szErrorMsg = e.ErrorMessage();	
		return false;
	}		
}

/******************************************************************************
*函数名:   IsConnected
*功能描述: 判断数据库连接是否已经连接
*前置条件: 数据库连接对象已经存在
*后置条件: 返回连接对象的连接状态真假值
*返回值:   TRUE--数据库连接对象已经处于连接状态
*           FALSE--数据库连接对象已经不处于连接状态
*******************************************************************************/
bool CAdo::IsConnected()
{
	if (m_pConn == NULL)
	{
		return FALSE;
	}

	if (m_pConn->GetState() == adStateClosed)
	{
		return FALSE;
	}

	return TRUE;
}

/******************************************************************************
*函数名:   IsRecordsetOpened
*功能描述: 判断数据库结果集对象是否已经打开
*前置条件: 数据库结果集对象已经存在
*后置条件: 返回结果集对象的连接状态真假值
*返回值:   TRUE--数据库结果集对象已经处于连接状态
*           FALSE--数据库结果集对象已经不处于连接状态
*******************************************************************************/
bool CAdo::IsRecordsetOpened()
{
	if (m_pRecordset == NULL)
	{
		return FALSE;
	}

	if (m_pRecordset->GetState() == adStateClosed)
	{
		return FALSE;
	}

	return TRUE;
}

/******************************************************************************
*函数名:   IsEndRecordset
*功能描述: 判断数据库结果集对象是否已经到达末尾
*前置条件: 数据库结果集对象已经存在
*后置条件: 返回结果集对象是否到达末尾真假值
*返回值:   TRUE--数据库结果集对象已经到达末尾
*           FALSE--数据库结果集对象还没有到达末尾
*******************************************************************************/
bool CAdo::IsEndRecordset()
{
	try
	{
		if (m_pRecordset->AdoEOF == VARIANT_TRUE)
		{
			return TRUE;
		}
	}
	catch (_com_error &e)
	{
		m_szErrorMsg = e.ErrorMessage();
		return FALSE;
	}

	return FALSE;
}

/******************************************************************************
*函数名:   MoveToNext
*功能描述: 移到到下一行
*前置条件: 数据库结果集有数据
*后置条件: 游标移到下一行
*******************************************************************************/
void CAdo::MoveToNext()
{
	try
	{
		if (!IsEndRecordset())
		{
			m_pRecordset->MoveNext();
		}
	}
	catch (_com_error &e)
	{
		m_szErrorMsg = e.ErrorMessage();
	}
}

/******************************************************************************
*函数名:   MoveToPrevious
*功能描述: 移到到上一行
*前置条件: 数据库结果集有数据
*后置条件: 游标移到上一行
*******************************************************************************/
void CAdo::MoveToPrevious()
{
	try
	{
		// 只有结果集处于打开状态,且记录行数至少要有2行
		if (IsRecordsetOpened() && GetRecordCount() >= 2)
		{
			m_pRecordset->MovePrevious();
		}
	}
	catch (_com_error &e)
	{
		m_szErrorMsg = e.ErrorMessage();
	}
}

/******************************************************************************
*函数名:   MoveToFirst
*功能描述: 游标移到首行
*前置条件: 数据库结果集有数据
*后置条件: 将游标移到首行
*******************************************************************************/
void CAdo::MoveToFirst()
{
	try
	{
		// 只有结果集处于打开状态,且记录行数至少要有一行
		if (IsRecordsetOpened() && GetRecordCount() >= 1)
		{
			m_pRecordset->MoveFirst();
		}
	}
	catch (_com_error &e)
	{
		m_szErrorMsg = e.ErrorMessage();
	}
}

/******************************************************************************
*函数名:   MoveToLast
*功能描述: 游标移到最后一行
*前置条件: 数据库结果集有数据
*后置条件: 将游标移到结果集最后一行
*******************************************************************************/
void CAdo::MoveToLast()
{
	try
	{
		// 只有结果集处于打开状态,且记录行数至少要有一行
		if (IsRecordsetOpened() && GetRecordCount() >= 1)
		{
			m_pRecordset->MoveLast();
		}
	}
	catch (_com_error &e)
	{
		m_szErrorMsg = e.ErrorMessage();
	}
}


/******************************************************************************
*函数名:   GetRecordCount()
*功能描述: 判断数据库结果集中记录的条数
*前置条件: 数据库结果集对象已经存在
*后置条件: 返回结果集记录的条数
*返回值:   long类型--记录的条数
*******************************************************************************/
long CAdo::GetRecordCount()
{
	try
	{
		if (m_pRecordset == NULL)
			return 0;

		// 返回记录行数
		return m_pRecordset->GetRecordCount();
	}
	catch (_com_error &e)
	{
		m_szErrorMsg = e.ErrorMessage();            // 记录出错信息
	}

	return FALSE;
}

/******************************************************************************
*函数名:   OpenRecordset
*功能描述: 打开结果集对象
*前置条件: 数据库结果集对象不为空
*后置条件: 打开结果集对象以提供后续操作
*参数:     T-SQL语句
*返回值:   TRUE--打开结果集对象成功
*           FALSE--打开结果集对象失败
*******************************************************************************/
bool CAdo::OpenRecordset(CString szSQL)
{
	try
	{
		// 如果关闭时不出现异常
		if (OpenConnection() && CloseRecordset())
		{
			m_pRecordset->Open((_variant_t)szSQL,          // T-SQL语句
				                m_pConn.GetInterfacePtr(), // 连接对象接口
				                adOpenDynamic,             // 动态打开 
				                adLockOptimistic,          // 锁定
				                adCmdText);                // 操作类型为命令文本
		}
		return TRUE;
	}
	catch (_com_error &e)
	{
		m_szErrorMsg = e.ErrorMessage();                  // 记录出错信息
		return FALSE;
	}
}

/******************************************************************************
*函数名:   ExecuteByConnection
*功能描述: 执行增、删、改操作
*前置条件: 数据库已经连接上
*后置条件: 返回受影响的行数
*返回值:   TRUE--操作成功
*           FALSE-操作失败
*参数:     T-SQL语句:szSQL:CString类型
*******************************************************************************/
bool CAdo::ExecuteByConnection(CString szSQL)
{
	try
	{
		// 如果打开失败,则退出
		if (!OpenConnection())
		{
			return FALSE;
		}

		// 受影响的行数
		_variant_t recordAffected;
	    m_pConn->Execute(_bstr_t(szSQL), &recordAffected, adCmdText);
	}
	catch (_com_error &e)
	{
		m_szErrorMsg = e.ErrorMessage();
		return FALSE;
	}

	return TRUE;
}


/******************************************************************************
*函数名:   GetErrorMsg
*功能描述: 获取出错的信息
*后置条件: 返回出错信息
*返回值:   出错的信息--类型:CString
*******************************************************************************/
CString CAdo::GetErrorMsg()
{
	return m_szErrorMsg;
}

/******************************************************************************
*函数名:   GetFieldValue
*功能描述: 获取字段值
*前置条件: 结果集有数据
*后置条件: 返回指定的字段的值
*返回值:   TRUE--获取到字段的值
*           FALSE-获取不到字段的值
*参数:     pFieldName : cahr *类型--标识字段名
*           strValue: CString类型--标识指定的字段的值
*******************************************************************************/
bool CAdo::GetFieldValue(char * pFieldName, CString& strValue)
{
     try
	 {
		 if (!IsRecordsetOpened())
			 return FALSE;

		 // 获取字段值
		 _variant_t vtFieldValue = m_pRecordset->Fields->GetItem(pFieldName)->Value;
		 
		 if (vtFieldValue.vt == VT_BSTR)  // 如果是字符串类型
		 {
			 strValue = (char *)(_bstr_t)vtFieldValue;
			 strValue.Trim();
			 return true;
		 }
	 }
	 catch (_com_error &e)
	 {
		 m_szErrorMsg = e.ErrorMessage();
	 }

	 return FALSE;
}

/******************************************************************************
*函数名:   IsFieldValueHasExisted
*功能描述: 判断指定的字段值是否已在存在
*返回值:   TRUE--指定的字段的值已经存在
*           FALSE-指定的字段的值不存在
*参数:     pFieldName : cahr *类型--标识字段名
*           strValue: CString类型--标识指定的字段的值
*******************************************************************************/
bool CAdo::IsFieldValueHasExisted(char * pFieldName, CString& strValue)
{
	try
	{
		CString strTempValue;

		// 获取字段值
		if (GetFieldValue(pFieldName, strTempValue))
		{
			if (strTempValue.Trim() == strValue)
			{
				return TRUE;
			}
		}
	}
	catch (_com_error &e)
	{
		m_szErrorMsg = e.ErrorMessage();
	}

	return FALSE;
}


目录
相关文章
|
12天前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
52 18
|
12天前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
38 13
|
12天前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
37 5
|
12天前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
28 5
|
12天前
|
Serverless 编译器 C++
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
本任务要求设计一个矩形类、圆形类和图形基类,计算并输出相应图形面积。相关知识点包括纯虚函数和抽象类的使用。 **目录:** - 任务描述 - 相关知识 - 纯虚函数 - 特点 - 使用场景 - 作用 - 注意事项 - 相关概念对比 - 抽象类的使用 - 定义与概念 - 使用场景 - 编程要求 - 测试说明 - 通关代码 - 测试结果 **任务概述:** 1. **图形基类(Shape)**:包含纯虚函数 `void PrintArea()`。 2. **矩形类(Rectangle)**:继承 Shape 类,重写 `Print
33 4
|
12天前
|
设计模式 IDE 编译器
【C++面向对象——类的多态性与虚函数】编写教学游戏:认识动物(头歌实践教学平台习题)【合集】
本项目旨在通过C++编程实现一个教学游戏,帮助小朋友认识动物。程序设计了一个动物园场景,包含Dog、Bird和Frog三种动物。每个动物都有move和shout行为,用于展示其特征。游戏随机挑选10个动物,前5个供学习,后5个用于测试。使用虚函数和多态实现不同动物的行为,确保代码灵活扩展。此外,通过typeid获取对象类型,并利用strstr辅助判断类型。相关头文件如&lt;string&gt;、&lt;cstdlib&gt;等确保程序正常运行。最终,根据小朋友的回答计算得分,提供互动学习体验。 - **任务描述**:编写教学游戏,随机挑选10个动物进行展示与测试。 - **类设计**:基类
26 3
|
21天前
|
SQL 关系型数据库 API
HarmonyOs开发:关系型数据库封装之增删改查
每个方法都预留了多种调用方式,比如使用callback异步回调或者使用Promise异步回调,亦或者同步执行,大家在使用的过程中,可以根据自身业务需要进行选择性调用,也分别暴露了成功和失败的方法,可以针对性的判断在执行的过程中是否执行成功。
85 13
|
2月前
|
SQL 存储 BI
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
78 2
|
2月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
132 5