b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

为什么要在C ++中使用嵌套类?

电脑杂谈  发布时间:2019-12-24 13:02:08  来源:网络整理

c 嵌套类_c set嵌套c out_a 类b类c类d类夹杂物

嵌套类与常规类一样,但是:

它们带有附加的访问限制(就像类定义中的所有定义一样),

它们不会污染给定的名称空间,例如全局名称空间。如果您觉得B类与A类之间的联系如此密切,但是A跟B的对象不一定相关联,那么您或许希望仅借助对A类进行范围划分来访问B类(将其称为A ::类)。

一些例子:

公开嵌套类以将其放在相关类的范围内

假设您想拥有一个SomeSpecificCollection将聚集class对象的类Element。然后,您可以:

声明两个类:SomeSpecificCollection和Element-不好,因为名称“ Element”足够通用c 嵌套类,可能造成名称冲突

引入命名空间someSpecificCollection并声明类someSpecificCollection::Collection和someSpecificCollection::Element。没有名称冲突的风险,但是它能够显得非常冗长吗?

声明两个全局类SomeSpecificCollection和SomeSpecificCollectionElement-有一些小特点,但也许还可以。

声明全局类SomeSpecificCollection和Element作为其嵌套类的类。然后:

您不会冒任何名称冲突的风险c 嵌套类,因为Element不在全局名称空间中,

在实现中,SomeSpecificCollection您将just Element,以及其它所有地方都称为SomeSpecificCollection::Element-,看起来与3.相同,但最明白

显而易见,它是“特定集合的元素”,而不是“特定集合的元素”

可见这SomeSpecificCollection也是一个类。

我觉得,最后一个变体肯定是很直观,因此也有最好的设计。

c 嵌套类_a 类b类c类d类夹杂物_c set嵌套c out

让我提出一下-与让两个全局类带有很具体的名称没有太大差别。它并非一个很小的细节,但是恕我直言,它让代码变得清晰。

在类范围内引入另一个范围

这针对采用typedef或泛型特别有用。我将在这里公布一个代码实例:

class Product {

public:

enum ProductType {

FANCY, AWESOME, USEFUL

};

enum ProductBoxType {

BOX, BAG, CRATE

};

Product(ProductType t, ProductBoxType b, String name);

// the rest of the class: fields, methods

};

然后一个将呼叫:

c set嵌套c out_a 类b类c类d类夹杂物_c 嵌套类

Product p(Product::FANCY, Product::BOX);

但是,在查看的代码完成建议时Product::,通常会列举所有可能的枚举值(BOX,FANCY,CRATE),并且在这里容易错误(C ++ 0x的强类型泛型可以缓解该疑问,但是没关系)。

但是,如果您使用嵌套类为那些枚举引入其它范围,则状况可能看起来像:

class Product {

public:

struct ProductType {

enum Enum { FANCY, AWESOME, USEFUL };

};

struct ProductBoxType {

enum Enum { BOX, BAG, CRATE };

};

Product(ProductType::Enum t, ProductBoxType::Enum b, String name);

// the rest of the class: fields, methods

};

然后,调用看起来像:

c set嵌套c out_a 类b类c类d类夹杂物_c 嵌套类

Product p(Product::ProductType::FANCY, Product::ProductBoxType::BOX);

然后,通过输入Product::ProductType::IDE,只能从建议的范围中获得枚举。这也降低了犯错的风险。

当然,对于小型类而言,这或许不是必需的,但是即使一个类有很多枚举,那么针对客户端程序员来说,事情更加更容易了。

同样,如果必须,您可以在模板中“组织”一大堆typedef。有时这是一个有用的方式。

PIMPL成语

PIMPL(指向IMPLementation的指针的缩写)是一种惯用法,可用于从标头中删除类的实现细节。每当头的“实现”部分修改时,这都降低了依据类的头再次编译类的需求。

通常使用嵌套类来实现:

Xh:

class X {

public:

X();

virtual ~X();

void publicInterface();

void publicInterface2();

private:

c 嵌套类_a 类b类c类d类夹杂物_c set嵌套c out

struct Impl;

std::unique_ptr<Impl> impl;

}

X.cpp:

#include "X.h"

#include <windows.h>

struct X::Impl {

HWND hWnd; // this field is a part of the class, but no need to include windows.h in header

// all private fields, methods go here

void privateMethod(HWND wnd);

void privateMethod();

};

X::X() : impl(new Impl()) {

// ...

}

// and the rest of definitions go here

如果完整的类定义必须个别外部库中种类的定义,该内部库具有沉重的或难看的头文件(使用WinAPI),则此用途非常有用。如果使用PIMPL,则没法将任何特定于WinAPI的功能封装在中,.cpp而依然不要将其包含在内.h。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-134487-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...