【发布时间】: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++ 中,
struct和class之间的唯一区别是成员的默认“可见性”。对于struct,默认成员为public,对于class,成员默认为private。 -
另外,在第一种情况下,结构是
MyStack类中的私有结构,就像Node类在第二个示例中是私有类一样。这是因为它是在MyStack中声明的,即使它是前向声明,范围仍然是在周围的类中。