【问题标题】:class and struct nesting类和结构嵌套
【发布时间】:2012-03-28 11:07:01
【问题描述】:

这段代码我不是很清楚

外层是class,内层是struct,谁能帮我解释一下?

class Stack {
    struct Link {
        void* data;
        Link* next;
        Link(void* dat, Link* nxt):
        data(dat),next(nxt) {}
    }* head;
public:
    Stack():head(0) {}
    ~Stack() {
        require(head==0,"Stack not empty");
    }
    void push(void* dat) {
        head = new Link( dat, head );
    }
    void peek() const {
        return head ? head->data : 0;
    }

    void* pop() {
        if(head == 0)  return 0;
        void* result = head->data;
        Link* oldHead = head;
        head = head->next;
        delete oldHead;
        return result;
    }
};

我的问题集中在前几行

class Stack {
    struct Link {
        void* data;
        Link* next;
        Link(void* dat, Link* nxt):
        data(dat),next(nxt) {}
    }* head;

class Stackstruct Link是什么关系?

【问题讨论】:

    标签: c++ class struct


    【解决方案1】:

    LinkStack内部声明,由于默认为private,所以不能在类外使用。

    另外,Stack 有一个成员 head,其类型为 Link*

    classstruct 之间的唯一区别是默认访问级别 - public 用于结构,private 用于类,所以不要让“在类中声明的结构”混淆您。除访问级别外,与“类内声明的类”或“结构内声明的结构”相同。

    【讨论】:

    • classstruct 之间的区别在 Inheritance 的情况下也很重要。Inheritance 在类的情况下默认为private,而在结构的情况下为public
    • @Als 这不是类内部访问级别的副作用吗?
    • Side-Effect?为什么?怎么样?
    • 堆栈中有什么元素?
    • @user1279988 head。它是在 struct 定义之后声明的。
    【解决方案2】:

    Stack 和结构Linknested
    请注意,嵌套类在访问嵌套类和封闭类的元素方面有一定的限制。

    由于Link 是在Struct 类中的private 访问说明符下声明的,因此无法在Struct 类之外访问它。

    【讨论】:

      【解决方案3】:

      Struct Link 在类中内部声明(正确的术语是嵌套的)。它只能在类中访问(由于其默认的私有访问器级别)。如果该结构被声明为 public,则可以使用 Stack::Link 引用它。

      在这种情况下这样声明的原因是只有类的内部方法需要使用链接,struct 提供了更好的代码组织。但是,只要没有其他类需要访问struct,这样的声明就可以提供更好的封装。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-04
        • 1970-01-01
        • 2020-10-30
        • 2012-09-23
        • 2011-09-27
        • 1970-01-01
        • 1970-01-01
        • 2016-07-19
        相关资源
        最近更新 更多