以下代码对 C++ 标准有效吗?奇怪的是 C::B 会起作用,因为 struct B 在 A 的命名空间中。但它确实可以用 gcc 编译。
struct A { struct B {}; };
struct C : public A::B {};
struct D : public C::B {};
如果这是符合标准的 C++,那么这个结构的合理应用是什么?谢谢。
以下代码对 C++ 标准有效吗?奇怪的是 C::B 会起作用,因为 struct B 在 A 的命名空间中。但它确实可以用 gcc 编译。
struct A { struct B {}; };
struct C : public A::B {};
struct D : public C::B {};
如果这是符合标准的 C++,那么这个结构的合理应用是什么?谢谢。
是的,它是有效的 C++。一个类在它自己的范围内(因此两者都B
引用B::B
同一个类B
),并且一个类的父类在它自己的范围内。所以既然B
is 在C
's 范围内并且B
在它自己的范围内,C::B
指的是B
which is A::B
。
(旁注:不要将命名空间与范围混淆。)
C++03 §9 第 2 段说:
类名被插入到在看到类名之后立即声明它的作用域中。类名也被插入到类本身的范围内;这被称为注入类名。出于访问检查的目的,注入的类名被视为公共成员名。
这是符合标准的 C++。
嵌套类的一个合理应用(通过范围解析)是 pImpl 设计模式(尽管您可以以不会演示嵌套类的方式实现它,但这里我选择演示嵌套类)。注意:继承是可能令人困惑的方面之一,但真正的概念是嵌套类的范围解析。
//ExposedClass in Exposed.h
class CExposedClass
{
public:
CExposedClass();
~CExposedClass();
void doThis();
void doThat();
private:
class CXImpl;
CXImpl *pImpl;
};
//ExposedClass Impl in Exposed.cpp
#include "Exposed.h"
class CExposedClass::CXImpl
{
int someData;
};
CExposedClass::CExposedClass():pImpl(new CXImpl()){}
CExposedClass::~CExposedClass(){delete pImpl;}
void CExposedClass::doThis(){}
void CExposedClass::doThat(){}
在一个类的范围内定义的类使用范围解析从另一个范围寻址。