两种方法的优缺点?
方法1:使用名称空间
namespace inner{
class MyInnerClass
{
public:
MyInnerClass();
virtual ~MyInnerClass();
};
};
#include "MyInnerClass.h"
namespace inner
{
MyInnerClass::MyInnerClass()
{
}
MyInnerClass::~MyInnerClass()
{
}
}
#include "MyInnerClass.h"
namespace inner{
class MyInnerClass;
};
class MyOuterClass
{
public:
MyOuterClass();
virtual ~MyOuterClass();
private:
inner::MyInnerClass* ptrMyInnerClass;
};
#include "MyOuterClass.h"
MyOuterClass::MyOuterClass()
{
ptrMyInnerClass= new inner::MyInnerClass();
}
MyOuterClass::~MyOuterClass()
{
}
方法2:实现为真正的内部类
class MyOuterClass
{
/* Inner Class */
public:
class MyInnerClass
{
public:
MyInnerClass() {}
virtual ~MyInnerClass() {}
};
public:
MyOuterClass();
virtual ~MyOuterClass();
private:
MyInnerClass* ptrMyInnerClass;
};
答案 0 :(得分:2)
在较大的项目中,否则会有障碍,将相似的对象或类归类到相应的名称空间中,以便于重构和可读性。
通常,一个仅对另一个对象是内在的对象,否则很少会被使用为私有内部类。这样,由于隐藏了实现且内部对象没有暴露,因此意图更加清晰。
答案 1 :(得分:2)
我只知道名称空间方案的一个优点。使用命名空间,您可以转发声明的类,而如果外部类定义不可用,则可以对内部类进行相同的处理。因此,使用命名空间,您可以执行以下操作:
namespace Outer {
class Inner;
}
但是,如果Outer
的定义不可用,则无法对内部类执行相同的操作:
class Outer; // we forward declare Outer
class Outer::Inner; // this doesn't compile
以同样的方式,如果没有定义Outer::Inner
,就无法定义Outer
。
因此,我几乎从不使用内部类(我只使用小型内部类,当我100%确定不需要前向声明时,通常是内部类不公开的情况)。
请注意,我通常使用第三个解决方案:我将“内部”类命名为OuterInner
。
例如,如果您有一个名为SomeManager
的外部类,并且有一个名为Node
的公共内部类,那么我将使用class SomeManagerNode
:
class SomeManager;
class SomeManagerNode;
我对此方法唯一了解的区别是SomeManagerNode
无法访问SomeManager
的非公共成员(如果Node
是SomeManager
的内部类,则可以访问它的所有成员)。但这在某些情况下可能是理想的,因此这并不是真正的缺点。但是,如果需要访问,则可以将SomeManagerNode
声明为friend
的{{1}}。
使用内部类的唯一原因是内部类是私有实现细节,而该类之外的任何地方都没有使用
。