【问题标题】:Can I implement linked list using object of a class instead of pointer to an object?我可以使用类的对象而不是指向对象的指针来实现链表吗?
【发布时间】:2021-08-25 09:35:55
【问题描述】:

在 C++ 中假设我有

class Sample{
 public:
 void someFunction();
};

在main()中做有什么区别

Sample obj;
obj.someFunction();

AND

Sample *obj = new Sample();
obj->someFunction();
delete obj;

我可以只使用 obj 而不是 *obj 在 C++ 中实现链表和树数据结构吗?这是唯一的疑问。

【问题讨论】:

  • 你需要某种间接方式——你不能把Sample放在Sample里面(在Sample里面...),因为宇宙会在你面前耗尽空间有一个。

标签: c++ class object pointers linked-list


【解决方案1】:

我将这个问题作为- 指针在链表中的作用是什么?

链接节点是链表中指针的基本作用,但其核心是链表的动态特性。

要获得答案,您首先需要了解内存管理的概念。主要有 2 段内存分配给正在运行的程序,即 Stack 和 Heap。栈之所以称为静态内存,是因为它的大小是固定的,不会按照程序的要求增长。堆被称为动态内存,因为它可以根据需要增长和缩小。

这就是我们分别在栈和堆中分配内存的方式-

Sample obj;  //this takes up space from stack i.e. `obj` resides in stack
Sample *obj = new Sample(); //a new chunk of memory is allocated from heap

而指针是访问在堆部分分配的内存的方式。现在问题变成了 - 为什么要使用动态内存(或堆)?

树或链表是一种动态数据结构,这意味着我们无法事先知道树或链表的大小,因为它们会在程序运行过程中增长和缩小。因此,如果我们继续使用堆栈中的内存,那么在某些时候我们可能会耗尽堆栈内存,这将导致 Stack overflow

如果您想了解有关指针和动态内存的更多信息,请访问link

【讨论】:

  • 非常感谢 avm,我明白了一切。
【解决方案2】:

在实现链表时,您总是需要一个指针(或引用)。这是为了链接到列表中的下一个值所必需的。例如,对于您的代码,您将需要

class Sample{
public:
 Sample *next;
 void someFunction();
};

你不能构建这样的东西:

class Sample{
    public:
     Sample next;
     void someFunction();
    };

因为将有无限的样本相互装箱。编译器无法知道列表应该有多长(如果您在编译时知道大小,则可以为此使用一些模板参数)

next 将指向列表中的下一个值。因此,在您的主要内容中,您将拥有:

int main() {
 // allocate 2 Sample objects 
 Sample *s1 = new Sample();
 Sample *s2 = new Sample():

 // link them together
 s1->next = s2;
 delete s1;
 delete s2;
}

当然,您可以将它们放在 main 的本地,例如:

int main() {
 // 2 Sample objects on  the stack 
 Sample s1;
 Sample s2:

 // link them together
 s1.next = &s2;
}

这里最大的区别是 s1 和 s2 是 main 函数的局部变量。只要我们谈论 main 就可以了,但你不能这样做:

Sample f() {
 Sample s1, s2;
 s1.next = &s2;
 return s1;
}

因为 s2 在 f 结束后不存在,所以 s1.next 将是一个无效的指针。

【讨论】:

  • 最好有Sample *next = nullptr; - 否则您的列表永远不会真正有效,因为最后一个next 链接未初始化。
  • 非常感谢大家。所有的文章都对我理解这个概念很有帮助。
猜你喜欢
  • 2021-12-12
  • 2020-12-06
  • 2021-08-05
  • 2013-03-27
  • 2023-02-09
  • 1970-01-01
  • 2012-11-11
  • 2013-10-24
  • 2020-01-18
相关资源
最近更新 更多