2013-10-16 60 views
0
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類的構造函數中,那麼它就可以工作。爲什麼當我從庫類調用checkOut方法時它不工作?爲什麼不是Book類中的checkOut方法設置Person,儘管它返回true?我不明白什麼?謝謝!指針問題,初學者例子

+0

什麼具體不工作?你現在得到的結果是什麼?你期望什麼? –

+4

第一個「問題」是你在現代C++程序中使用裸指針。 – WhozCraig

+0

checkout方法返回true,但Book對象的Person字段不會設置。在這種情況下,我應該使用什麼而不是裸指針?我剛開始學習:) – user2879175

回答

0

你的問題是這樣的:

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

關於這個應該怎麼沒有指針來完成,那是另外一個話題,但是這應該解決您的眼前問題。

+0

我怎麼沒有看到這個。謝謝!整天都在檢查一個錯誤:) – user2879175

+0

@ user2879175因爲如果你幾乎看不到代碼,一般會在你身上彈出細微的錯誤。如果你盯着它,那麼微妙的錯誤就會迷失在你想要做的事情的迷霧中。一段時間休息一下,回來,然後重新思考一步一步發生的事情,然後按照代碼看看它是否屬實。它有助於。 – WhozCraig