【发布时间】:2020-01-03 11:52:09
【问题描述】:
出于教育目的,我正在编写一个基于单链表的模板化 Stack 类。我为一个节点写了一个类:
template <typename T>
class StackNode {
private:
T data;
StackNode<T> *next;
// TODO: make Stack a friend
};
我开始自己编写堆栈:
template <typename T>
class Stack {
private:
StackNode<T> *head;
unsigned long long int size;
public:
Stack(): head(nullptr), size(0) {}
void push(const T& element) {
StackNode<T> *new_element = new StackNode<T>;
new_element -> data = element;
new_element -> next = head;
head = new_element;
++size;
}
};
显然,这两行
new_element -> data = element;
new_element -> next = head;
给我带来了麻烦,因为我正在尝试访问私人成员。我想让Stack 成为StackNode 的朋友。我该怎么做?
当我在 StackNode 的 TODO 行中写入 friend class Stack<T> 时,我的 CLion IDE 用红色波浪线在 Stack 下划线,它表示我已将 Stack 重新定义为另一种符号。我不知道如何解决这个问题。
更新:
我的main 函数如下所示:
int main() {
Stack<long long int> s;
s.push(12);
return 0;
}
感谢您的帮助。
【问题讨论】:
-
为什么不在 Stack 的私有范围内将 StackNode 类定义为 struct 呢?那你就不会有这个问题了。 StackNode 中不需要私有成员,因为它对外不可见。
-
此外,您应该展示一个最小的可复制示例,因为无论如何如果没有前向声明,这将无法工作。所以我们不能确定你做错了什么。
-
@lars 同样,出于教育目的,我不想将 StackNode 定义为结构。
-
@lars 我添加了我的主要功能。现在是完整的脚本。
-
出于教育目的,选择简单、好的设计是有意义的。我认为这不是很好的“朋友”例子。