类定义中嵌套结构为什么不可以?

书上说结构体定义可以嵌套结构体定义,但类定义不能嵌套结构体定义,这是为什么呢... 书上说结构体定义可以嵌套结构体定义,但类定义不能嵌套结构体定义,这是为什么呢 展开
 我来答
bhtzu
2015-07-31 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8088
采纳率:85%
帮助的人:4232万
展开全部

类定义中嵌套结构体是可以的,这里要分几种情况说明:

  1. 对于已经声明的(在类外)结构体类型,在类定义内嵌套结构体变量,没有任何问题。

  2. 在类定义内直接定义结构体类型并同时声明结构体变量,也是可以的,但这个结构体类型无法在类外使用。

  3. 在类内只定义结构体类型,而不同时声明结构体变量是不可以的(这个在结构体定义内同样如此)。

  4. 大多数情况下,我们建议将结构体类型的定义放在类的外面,这样定义的结构体可以在更多的地方(类外)使用,而不会发生使用逻辑歧义和编译错误。


其实类就是在C++中,对C语言结构体的扩展,在C++中可以将结构体看做是一个最简单的类。而“类嵌套”则是C++面向对象涉及的一个应用技巧,用于接口封装(隐藏)和成员共享,但这和嵌套结构体没有太大的关系,有兴趣可以专门看看相关的书籍。

另外,结构体的定义,有两种形式,其中一种带有typedef关键字,另一种不带。这两种定义是由差别的,简单的说,typedef是声明了一种“变量类型”,不带typedef是直接声明结构体变量,具体应用的差别参考结构体声明的相关书籍章节。

幸巴达
2015-06-11 · TA获得超过1.2万个赞
知道大有可为答主
回答量:6953
采纳率:38%
帮助的人:2470万
展开全部
类中可以嵌套结构,调用的时候前面要加类名。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
何小東
2014-05-25 · TA获得超过402个赞
知道小有建树答主
回答量:388
采纳率:0%
帮助的人:238万
展开全部

在一个类的内部定义另一个类或结构体,我们称之为嵌套类(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
这就是嵌套
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式