C++学习笔记----8、掌握类与对象(五)---- 嵌套类与类中枚举

1、嵌套类

类定义中不仅仅可以包含成员函数与数据成员。也可以包含嵌套类与struct,类型别名,以及枚举。在类中声明的任何东西都在类范围内。如果它是public,可以通过className::的范围解析语法来在类外进行访问。

可以在另一个类定义中提供一个类定义。例如,你可能决定 让SpreadsheetCell类成为Spreadsheet类的一部分。由于它变成了Spreadsheet类的一部分,你可能也会重新将其命名为Cell。可以将它们定义成这样子:

cpp 复制代码
export class Spreadsheet
{
public:

	class Cell
	{
	public:
		Cell() = default;
		Cell(double initialValue);
        // Remainder omitted for brevity
	};

	Spreadsheet(std::size_t width, std::size_t height,
		const SpreadsheetApplication& theApp);
    // Remainder of Spreadsheet declarations omitted for brevity
};

现在,Cell类定义在了Spreadsheet类的内部,所以在Spreadsheet类之外对Cell的任何动作,必须给出Spreadsheet::的范围名。即使对于成员函数定义也一样。例如,Cell的double构造函数看起来像这样:

cpp 复制代码
Spreadsheet::Cell::Cell(double initialValue)
	: m_value { initialValue }
{
}

甚至对于Spreadsheet类自身的成员函数的返回类型(不是参数)也要使用这个语法:

cpp 复制代码
const Spreadsheet::Cell& Spreadsheet::getCellAt(size_t x, size_t y) const
{
	verifyCoordinate(x, y);
	return m_cells[x][y];
}

在Spreadsheet类内部直接完整地定义嵌套Cell类舍不得Spreadsheet类定义有一点儿臃肿。可以通过只包含一个Spreadsheet类的Cell的前向声明来简化,然后对Cell类进行单独定义,如下:

cpp 复制代码
export class Spreadsheet
{
public:
    class Cell;
    Spreadsheet(std::size_t width, std::size_t height,
    const SpreadsheetApplication& theApp);
    // Remainder of Spreadsheet declarations omitted for brevity
};

class Spreadsheet::Cell
{
public:
    Cell() = default;
    Cell(double initialValue);
    // Omitted for brevity
};

2、类中枚举

枚举也可以成为类中的数据成员。例如,可以添加SpreadsheetCell类的cell颜色如下:

cpp 复制代码
export class SpreadsheetCell
{
public:
	// Omitted for brevity
	enum class Color { Red = 1, Green, Blue, Yellow };
	void setColor(Color color);
	Color getColor() const;

private:
	// Omitted for brevity
	Color m_color{ Color::Red };
};

setColor()与getColor()成员函数的实现很直接:

cpp 复制代码
void SpreadsheetCell::setColor(Color color) { m_color = color; }
SpreadsheetCell::Color SpreadsheetCell::getColor() const { return m_color; }

新的成员函数使用如下:

cpp 复制代码
SpreadsheetCell myCell { 5 };
myCell.setColor(SpreadsheetCell::Color::Blue);
auto color { myCell.getColor() };
相关推荐
小陈的进阶之路13 分钟前
爬虫三大解析库:lxml, jsonpath, bs4
开发语言·笔记·python
fanged13 分钟前
设备树学习5--读写实操(TODO)
学习
wuyk55515 分钟前
第1章:无刷电机核心原理与运行机制
c语言·开发语言·stm32·单片机·嵌入式硬件·机器学习
SomeB1oody18 分钟前
【RustyML入门】2.10. 主成分分析
开发语言·后端·机器学习·rust·教程
2603_9651481128 分钟前
抖音/快手直播选品:用API快速匹配爆款与低价货源
开发语言·python·自动化·api
RobinDevNotes30 分钟前
轻量级动画引擎Anime.js迎来V4大版本更新
开发语言·前端·javascript·ecmascript·动画·c4前端
lv__pf32 分钟前
servlet与jsp
java·开发语言·servlet
xieliyu.1 小时前
Java 文件IO :File 文件类、字节流、字符流讲解
java·ide·笔记·javaee
天天爱吃肉82181 小时前
行业笔记|高压连接器瞬态接触退化通用检测方法论
人工智能·笔记·python·功能测试·学习·汽车
Hhy_11071 小时前
【从零开始学数据结构 ⑥】:二叉树之堆——打破规则的优先队列
c语言·开发语言·数据结构·学习·visual studio