【问题标题】:Pointer issue, beginner example指针问题,初学者示例
【发布时间】:2013-10-16 16:22:15
【问题描述】:
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 类的构造函数中,那么它可以工作。为什么当我从 Library 类调用 checkOut 方法时它不起作用?为什么 checkOut 方法没有在 Book 类中设置 Person ,尽管它返回 true ?我不明白什么?谢谢!

【问题讨论】:

  • 什么具体不起作用?你现在得到的结果是什么,你期望什么?
  • 第一个“问题”是您在现代 C++ 程序中使用裸指针。
  • checkout 方法返回 true,但不会设置 Book 对象的 Person 字段。在这种情况下,我应该使用什么来代替裸指针?我刚开始学习:)
  • 价值观。或智能指针。

标签: c++ function class pointers


【解决方案1】:

你的问题是这样的:

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;}

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

【讨论】:

  • 我怎么没看到这个。谢谢!一整天都在检查错误:)
  • @user2879175 因为如果您几乎不看代码,通常会出现细微的错误。如果你盯着它久了,那么细微的错误就会迷失在你对它应该做什么的想法的迷雾中。偶尔休息一下,回来,然后一步一步地重新思考你认为正在发生的事情,然后按照代码来看看它是否真实。它有帮助。
猜你喜欢
  • 2012-03-03
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 2012-11-17
相关资源
最近更新 更多