类定义中嵌套结构体是可以的,这里要分几种情况说明:
对于已经声明的(在类外)结构体类型,在类定义内嵌套结构体变量,没有任何问题。
在类定义内直接定义结构体类型并同时声明结构体变量,也是可以的,但这个结构体类型无法在类外使用。
在类内只定义结构体类型,而不同时声明结构体变量是不可以的(这个在结构体定义内同样如此)。
大多数情况下,我们建议将结构体类型的定义放在类的外面,这样定义的结构体可以在更多的地方(类外)使用,而不会发生使用逻辑歧义和编译错误。
其实类就是在C++中,对C语言结构体的扩展,在C++中可以将结构体看做是一个最简单的类。而“类嵌套”则是C++面向对象涉及的一个应用技巧,用于接口封装(隐藏)和成员共享,但这和嵌套结构体没有太大的关系,有兴趣可以专门看看相关的书籍。
另外,结构体的定义,有两种形式,其中一种带有typedef关键字,另一种不带。这两种定义是由差别的,简单的说,typedef是声明了一种“变量类型”,不带typedef是直接声明结构体变量,具体应用的差别参考结构体声明的相关书籍章节。
在一个类的内部定义另一个类或结构体,我们称之为嵌套类(nested class),或者嵌套类型。之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现。
虽然嵌套类在外围类内部定义,但它是一个独立的类,基本上与外围类不相关。它的成员不属于外围类,同样,外围类的成员也不属于该嵌套类。嵌套类的出现只是告诉外围类有一个这样的类型成员供外围类使用。并且,外围类对嵌套类成员的访问没有任何特权,嵌套类对外围类成员的访问也同样如此,它们都遵循普通类所具有的标号访问控制。
前面说过,之所以使用嵌套类的另一个原因是达到底层实现隐藏的目的。为了实现这种目的,我们需要在另一个头文件中定义该嵌套类,而只在外围类中前向声明这个嵌套类即可。当然,在外围类外面定义这个嵌套类时,应该使用外围类进行限定。使用时,只需要在外围类的实现文件中包含这个头文件即可。
另外,嵌套类可以直接引用外围类的静态成员、类型名和枚举成员,即使这些是private的。
实例如下:
#ifndef NESTCLASS_H_
#define NESTCLASS_H_
class A
{
public:
A();
~A();
void operate();
private:
class B;
B* m_b;
};
#endif
#include "nestclass.h"
#include <iostream>
using namespace std;
class A::B
{
public:
B(){}
~B(){}
void operate()
{
cout<<"B operate!"<<endl;
}
};
A::A()
{
}
A::~A()
{
}
void A::operate()
{
m_b = new B;
cout<<"A operate!"<<endl;
m_b->operate();
}
#include "nestclass.h"
void main()
{
A a;
a.operate();
}
在嵌套类的定义被看到之前我们只能声明嵌套类的指针和引用,如上面在A中定义为B m_b而不是B* m_b将会引发一个编译错误。关于C++嵌套类的详细用法请参考《C++ Primer 第三版》P551
嵌套结构体为什么不可以呢
struct 里可以包含struct
例如
typedef struct tagstru1
{
int a;
int b;
}stru1;
typedef struct tagstru2
{
int a;
int b;
stru1 s;
}stru2;
stru2 里就包含了 stru1
这就是嵌套