“const char *”类型的参数与“Person”类型的参数不兼容

问题描述 投票:0回答:2
#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类中的四个参数吗?我将如何解决此问题并摆脱错误?

c++ error-handling linked-list
2个回答
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可能带有垃圾指针的所有问题,以及它可以从LinkedListmain下拉出地毯的所有方法!

除非你真的需要一些疯狂优化的原始指针,我强烈建议你阅读resource acquisition is initialization并把它放在心上 - 它比使用原始指针更乏味,但它会为你节省很多麻烦。


0
投票

InsertAtHead函数采用Person*类型的一个参数。你传递了四个参数。相反,传递一个指向Person的指针。

你真的不应该这样使用裸指针。这使得管理指向的对象的生命周期变得极其困难。你的InsertAtHead函数接受一个指向现有Person对象的指针并存储它。如果Person对象被破坏,该指针将变为无效。这只是在寻找麻烦。

© www.soinside.com 2019 - 2024. All rights reserved.