一 内部类
- 将一个类定义在另一个类的内部
- 内部类与外部类没有任何关系,相互不能调用和访问。
- 内部类相当于加了一个限定符,调用和使用时需要用到外部类的类名。
class OuterClass
{
public:
void classOuterFunc();
int m_outer;
class InClass
{
public:
void classInFunc();
int m_in;
};
};
void OuterClass::classOuterFunc()
{
qDebug()<<"外部类类外实现";
}
void OuterClass::InClass::classInFunc()
{
qDebug()<<"内部类类外实现";
}
OuterClass outClassA;
outClassA.classOuterFunc();
OuterClass::InClass inClassA;
inClassA.classInFunc();
二 内部类模板
- 其实也就是在类模板中嵌套一个类模板
2.1 声明类模板
- 首先我们要先声明一个内部类模板
- 这里外部类使用T1,内部类使用T2
template<typename T1>
class OuterClass
{
public:
void classOuterFunc();
T1 m_outer;
template<typename T2>
class InClass
{
public:
void classInFunc();
T2 m_in;
};
};
2.2 类外实现
- 然后再类外定义这两个类模板的成员函数
- 这里要注意的是,对于内部类模板,声明时也需要两级模板来声明
template<typename T1>
void OuterClass<T1>::classOuterFunc()
{
qDebug()<<"外部模板类外实现";
}
template<typename T1>
template<typename T2>
void OuterClass<T1>::InClass<T2>::classInFunc()
{
qDebug()<<"内部模板类实现";
}
2.3 调用
- 同样的调用我们也需要两层
OuterClass<int> outClassA;
outClassA.classOuterFunc();
OuterClass<QString>::InClass<float> inClassA;
inClassA.classInFunc();
2.4 注意
- 这两个类模板的参数不能是同一个,比如外部类模板是T1那么内部类模板就不能是T1
- 有个很有意思的特点,比如一个类的声明处的参数模板用的是T1,定义处用的是T2这并不会造成任何影响。比如下面这样我让上面的两个函数定义处和声明的模板参数完全相反,是不会影响真正的使用的。
template<typename T>
class OuterClass
{
public:
void classOuterFunc();
T m_outer;
template<typename T1>
class InClass
{
public:
void classInFunc();
T1 m_in;
};
};
template<typename T2>
void OuterClass<T2>::classOuterFunc()
{
qDebug()<<"外部模板类外实现";
}
template<typename T2>
template<typename T3>
void OuterClass<T2>::InClass<T3>::classInFunc()
{
qDebug()<<"内部模板类实现";
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
OuterClass<int> outClassA;
outClassA.classOuterFunc();
qDebug()<<typeid(outClassA.m_outer).name();
OuterClass<QString>::InClass<float> inClassA;
inClassA.classInFunc();
qDebug()<<typeid(inClassA.m_in).name();
return a.exec();
}