指针问题,初学者示例

Pointer issue, beginner example

本文关键字:初学者 问题 指针      更新时间:2023-10-16
class Person {
    ...
};
class Book {
private:
    ...
    Person *person;
    ...
public:
    ...
    Person *getPerson() {return person;}
    void setPerson(Person *_person) {person = _person;}
    ...
};
class Library {
private:
    vector<Book> books;
    vector<Person> people;
public:
    vector<Book> getBooks() {return books;}
    vector<Person> getPeople() {return people;}
    void addBook(Book _book) {//adds a Book to books}
    void addPerson(Person _person) {//adds a Person to people}
    bool checkOut(Person *_person, Book *_book) {
        if (_book->getPerson() == NULL ) {
            _book->setPerson(_person);
            return true;
        }
        else {
            return false;
        }
    }
int main() {
    Library lib("My Library");
    Book b1("The C Programming Language", "Brian Kernighan and Dennis Ritchie");
    Book b2("Unknown Title", "Unknown Author");
    Book b3("Burning Daylight", "Jack London");
    Person p1("John");
    Person p2("Peter");
    Person p3("Ann");
    lib.addPerson(p1);
    lib.addPerson(p2);
    lib.addPerson(p3);
    lib.addBook(b1);
    lib.addBook(b2);
    lib.addBook(b3);
    lib.checkOut(&lib.getPeople().at(1), &lib.getBooks().at(1));
    return 0;
}

程序运行。如果我把 setPerson 放在 Book 类的构造函数中,那么它可以工作。为什么当我从库类调用结帐方法时它不起作用?为什么结帐方法不在 Book 类中设置 Person ,尽管它返回 true ?我有什么不明白的?谢谢!

你的问题是这样的:

vector<Book> getBooks() {return books;}
vector<Person> getPeople() {return people;}

这两者都是按值返回图书馆的人物和书籍向量。因此,您将在两个与库中的实际向量无关的向量中建立关系。它们保持不变。

因此,稍后:

lib.checkOut(&lib.getPeople().at(1), &lib.getBooks().at(1));

对库的真实向量不执行任何操作。

将它们更改为:

vector<Book>& getBooks() {return books;}
vector<Person>& getPeople() {return people;}

关于如何在没有指针的情况下完成此操作,这是另一个主题,但这应该解决您的直接问题。