【发布时间】:2016-07-21 22:09:05
【问题描述】:
我是 C++ 新手,并尝试通过实现 LinkedList 来熟悉该语言。
class ListElement {
public:
int val;
ListElement *next;
ListElement(int v, ListElement *n) {val = v; next = n;};
};
ListElement 包含一个 int 值 val 和一个指向下一个列表元素的指针(nullptr,如果没有下一个元素)和一个构造函数。
class MyLinkedList {
public:
ListElement *head;
MyLinkedList() {head = nullptr;};
ListElement* getHead(void){
return head;
};
void append(int i) {
head = &ListElement(i, head);
};
};
MyLinkedList 包含一个指向名为head 的列表的第一个元素的指针,以及一些在列表上工作的方法。在这些方法中遇到了一些错误,我试图追查它们的原因。 (我知道公共类成员的 getter 根本没有意义,最初 head 是私有的。)这样做我观察到以下我无法解释的行为:
int main() {
MyLinkedList l;
l.append(1);
int x = l.head->val;
cout << "head: " << x << "\n";
int y = l.getHead()->val;
cout << "getHead(): " << y << "\n";
int z = l.head->val;
cout << "head: " << z << "\n";
cin.get();
return 0;
}
运行此代码(添加 #include <iostream> 和 using namespace std; 作为工作示例)打印
head: 1
getHead(): 18085840
head: -858993460
所以head 的第一次直接访问按预期工作,产生1 作为第一个列表元素的值,但使用getter 返回垃圾。如果再次直接访问head,它也会产生垃圾,这让我觉得“嗯,似乎使用 getHead() 会以某种方式混淆 ListMember 对象”,只是为了发现
int x = l.head->val;
cout << "head: " << x << "\n";
int z = l.head->val;
cout << "head: " << z << "\n";
打印
head: 1
head: -858993460
甚至没有接触吸气剂。那么仅仅以任何方式访问l.head 是否足以造成乱码?
不,因为
int x = l.head->val;
int z = l.head->val;
cout << "head: " << x << "\n";
cout << "head: " << z << "\n";
返回(按预期)head: 1 两次。那么在更改我的对象或它们的指针之间使用cout? getHead() 有什么问题,因为它只是 return head;?
所以我在这里很迷茫,找不到任何直接相关的问题。 (This Question 有一个很有前途的标题,但不使用指针)。我完全没有以正确的方式使用指针吗?还是在幕后进行一些自动对象删除?或者这就是 magiC++ 的工作原理?
【问题讨论】:
-
head = &ListElement(i, head);- 这不是您分配新ListElement的方式。去阅读new(然后在大多数情况下,尽量避免需要它)。 -
为了更好的衡量标准,您可能还想了解smart pointers
-
@jaggedSpire 是的,我的错 - 我猜想得太迟了:\