- 在C++中将内部类实现为具有名称空间的独立类有什么优势
- 接近-1会有任何额外的优势吗
-
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
的非公共成员(如果Node
是SomeManager
的内部类,它可以访问它的所有成员(。但在某些情况下,这可能是可取的,所以这并不是一个真正的缺点。但是如果需要访问,可以将SomeManagerNode
声明为SomeManager
的friend
。
使用内部类的唯一原因是当内部类是私有实现细节时,该细节在类之外的任何地方都不使用。