#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-&gt; InsertAtHead”(“Bob”,22,145,70);“”行。这对我来说没有意义,因为如果我指向InsertAtHead函数中的Person对象,它不应该使用Person对象传递Person类中的四个参数吗?我将如何解决此问题并摆脱错误?
答案 0 :(得分:1)
您对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并牢记它 - 它比使用原始指针更乏味,但它会节省你在路上遇到了很多麻烦。
答案 1 :(得分:0)
InsertAtHead
函数采用Person*
类型的一个参数。你传递了四个参数。而是将指针传递给Person
。
你真的不应该这样使用裸指针。这使得管理指向的对象的生命周期变得极其困难。您的InsertAtHead
函数获取指向现有Person
对象的指针并存储它。如果Person
对象被销毁,该指针将变为无效。这只是在惹麻烦。