在C++中将内部类实现为具有名称空间的独立类有什么好处


  1. 在C++中将内部类实现为具有名称空间的独立类有什么优势
  2. 接近-1会有任何额外的优势吗
  3. Pros&两种方法都一致吗?

    Approach-1:使用命名空间

MyInnerClass.h

namespace inner{
class MyInnerClass
{
public:
MyInnerClass();
virtual ~MyInnerClass();
};
};

MyInnerClass.cpp

#include "MyInnerClass.h"
namespace inner
{
MyInnerClass::MyInnerClass()
{
}
MyInnerClass::~MyInnerClass()
{
}
}

MyOuterClass.h

#include "MyInnerClass.h"
namespace inner{
class MyInnerClass;
};
class MyOuterClass
{
public:
MyOuterClass();
virtual ~MyOuterClass();
private:
inner::MyInnerClass* ptrMyInnerClass;
};

MyOuterClass.cpp

#include "MyOuterClass.h"
MyOuterClass::MyOuterClass()
{
ptrMyInnerClass= new inner::MyInnerClass();
}
MyOuterClass::~MyOuterClass()
{
}

Approach-2:实现为真正的内部类

class MyOuterClass
{
/*  Inner Class */
public:
class MyInnerClass
{
public:
MyInnerClass() {}
virtual ~MyInnerClass() {}
};
public:
MyOuterClass();
virtual ~MyOuterClass();
private:
MyInnerClass* ptrMyInnerClass;
};

在较大的项目中,为了便于重构和可读性,类似的对象或类被分类到相应的名称空间中,否则将受到阻碍。

通常情况下,一个只属于另一个对象的内部对象,很少被使用,它被声明为私有内部类。通过这样做,由于实现是隐藏的,而内部对象是不公开的,所以意图更加清晰。

我只知道名称空间方案的一个优点。使用名称空间,可以转发声明类,而如果外部类定义不可用,则不能对内部类执行同样的操作。因此,使用名称空间,您可以这样做:

namespace Outer {
class Inner;
}

但是,如果Outer的定义不可用,则不能对内部类执行相同的操作:

class Outer; // we forward declare Outer
class Outer::Inner; // this doesn't compile

同样,如果没有Outer的定义,就不能定义Outer::Inner

正因为如此,我几乎从不使用内部类(当我100%确定不需要正向声明时,我只使用小的内部类,这通常是在内部类不是公共的情况下(。

注意,我通常使用第三种解决方案:我将"内部"类命名为类似OuterInner的类。

例如,如果您有一个名为SomeManager的外部类,并且您将有一个名称为Node的公共内部类,那么我将使用class SomeManagerNode:

class SomeManager;
class SomeManagerNode;

关于这个方法,我所知道的唯一区别是SomeManagerNode不能访问SomeManager的非公共成员(如果NodeSomeManager的内部类,它可以访问它的所有成员(。但在某些情况下,这可能是可取的,所以这并不是一个真正的缺点。但是如果需要访问,可以将SomeManagerNode声明为SomeManagerfriend

使用内部类的唯一原因是当内部类是私有实现细节时,该细节在类之外的任何地方都不使用。

最新更新