【问题标题】:Stack Using Struct or Class to implement its private dataStack 使用 Struct 或 Class 来实现其私有数据
【发布时间】:2013-03-19 08:12:56
【问题描述】:

我想通过使用链表来实现一个堆栈类。 这是我在头文件中定义的方式。对于堆栈中的每个元素,元素中有两个数据:

#ifndef MYSTACK_H_INCLUDED
#define MYSTACK_H_INCLUDED
#include <iostream>
using namespace std;

template<typename T>
class MyStack{
public:
    MyStack();
    ~MyStack();
    ...
    ...
private:
    struct node;
    node* head;
    int _top;
};

template<typename T>
struct MyStack<T>::node {
    node(node*, T, T);
    T position_x;
    T position_y;
    node* next;
};

但是如果我将私有字段中的结构节点更改为这样的类:

#ifndef MYSTACK_H_INCLUDED
#define MYSTACK_H_INCLUDED
#include <cstddef> // for std:size_t
using namespace std;

template <class T>
class MyStack{
public:
    MyStack();
    ~MyStack();
    ...
    ...
private:
    class Node {
        friend class MyStack<T>;
    public:
        Node(T, Node*);
    private:
        const T value; 
        Node *next;   
    };
    Node *head;  


};
#endif // MYSTACK_H_INCLUDED

是否有必要在 Stack 类中为 Node 创建另一个类,或者我只使用 Struct ? 为什么?

【问题讨论】:

  • 在 C++ 中,structclass 之间的唯一区别是成员的默认“可见性”。对于struct,默认成员为public,对于class,成员默认为private
  • 另外,在第一种情况下,结构 MyStack 类中的私有结构,就像Node 类在第二个示例中是私有类一样。这是因为它是在MyStack 中声明的,即使它是前向声明,范围仍然是在周围的类中。

标签: c++ class struct stack


【解决方案1】:

每当我不想公开内部数据时,我都会做你现在正在做的事情。我定义了我的链表

template <class T>
class List{

    class Node{
    public:

         friend class List;              

    private:

         private members
    };

    public:
};

我更喜欢这种风格,因为我用 Java 编程,它以这种对我来说很舒服的格式使用内部和静态内部类。

您将需要封装 Node 的私有字段以从 List 访问它们,但除此之外,您可以这样定义您的类,甚至可以使用结构,但请记住,类和结构之间的唯一区别是结构成员默认情况下是公共的.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多