#include <iostream>
#include <string>
using namespace std;
class Person{
private:
string name;
int age, height, weight;
public:
Person(string name = "empty", int age = 0, int height = 0, int weight = 0) {
this->name = name;
this->age = age;
this->height = height;
this->weight = weight;
}
};
class Node {
public:
Person* data;
Node* next;
Node(Person*A) {
data = A;
next = nullptr;
}
};
class LinkedList {
public:
Node * head;
LinkedList() {
head = nullptr;
}
void InsertAtHead(Person*A) {
Node* node = new Node(A);
node->next = head;
head = node;
}
void Print() {
Node* temp = head;
while (temp != nullptr) {
cout << temp->data << " ";
temp = temp->next;
}
cout << endl;
}
};
int main() {
LinkedList* list = new LinkedList();
list->InsertAtHead("Bob", 22, 145, 70); list->Print(); //2
}
我收到了问题中所述的错误。我是C ++的新手,无法理解为什么会抛出这个错误。错误发生在“list-> InsertAtHead”(“Bob”,22,145,70);“”行。这对我来说没有意义,因为如果我指向InsertAtHead函数中的Person对象,它不应该使用Person对象传递Person类中的四个参数吗?我将如何解决此问题并摆脱错误?
你对LinkedList::InsertAtHead
的定义是:
void InsertAtHead(Person*A) { /* ... */ }
这意味着你必须给它一个指向Person
对象的指针。你这样称呼它:
list->InsertAtHead("Bob", 22, 145, 70);
这给了它一个const char*
和一堆整数。我的猜测是你想要这样做:
list->InsertAtHead(new Person("Bob", 22, 145, 70));
当然,你也可以这样做:
Person *p = new Person("Bob", 22, 145, 70);
list->InsertAtHead(p);
但这凸显了你设计中的一个潜在缺陷:谁拥有指针*p
?如果你从delete p
调用main
,那么LinkedList
对象将有一个指向垃圾的指针。如果你在delete A
中调用LinkedList::InsertAtHead
,现在main
有一个指向垃圾的指针。这更不用说Node
可能带有垃圾指针的所有问题,以及它可以从LinkedList
和main
下拉出地毯的所有方法!
除非你真的需要一些疯狂优化的原始指针,我强烈建议你阅读resource acquisition is initialization并把它放在心上 - 它比使用原始指针更乏味,但它会为你节省很多麻烦。
InsertAtHead
函数采用Person*
类型的一个参数。你传递了四个参数。相反,传递一个指向Person
的指针。
你真的不应该这样使用裸指针。这使得管理指向的对象的生命周期变得极其困难。你的InsertAtHead
函数接受一个指向现有Person
对象的指针并存储它。如果Person
对象被破坏,该指针将变为无效。这只是在寻找麻烦。