2013-10-16 2 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; 
} 

프로그램이 실행됩니다. Book 클래스의 생성자에 setPerson을두면 작동합니다. 라이브러리 클래스에서 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