2013-10-14 2 views
0
class Person { 
..... 
}  
class Book { 
    string title; 
    Person person; 
    .... 
    Person getPerson() { 
     return person; 
    } 
    .... 
} 

int main() { 
Person p1; 
Book b1; 

b1.setPerson(p1); 

b1.getPerson(); 


} 

Мой вопрос: какова ценность человека в b1, что делает b1.getPerson() return? Как проверить, имеет ли это поле значение или нет? Я хочу проверить, имеет ли книга назначенное лицо, если нет, тогда назначьте человека.Значение неинициализированного поля в классе

bool isPerson(Person _person, Book _book) { 
     if (_book.getPerson() == NULL) { 
      _book.setPerson(_person); 
      return true; 
     } 
     else { 
      return false; 
     } 

Это то, что я хотел сделать, но == NULL неверен.

Спасибо!

+8

'Книга' имеет' Лицо', которое получает по умолчанию. Это объект, и он вряд ли будет сопоставим с «NULL», который используется для выражения нулевого указателя. – juanchopanza

+0

Чтобы добавить к @juanchopanza, ваши конструкторы 'Book' должны включать логику для вызова и инициализации конструкторов' Person' в той или иной форме. – nhgrif

+0

Это то, что вы сделали бы в JAVA. В C++, если вы не объявляете что-то в качестве указателя, вы также не можете назначить ему NULL. человек * не * указатель в вашем классе, вместо этого ваш книжный класс непосредственно содержит объект человека, и поэтому он также не может ben ull – codeling

ответ

1

У вас есть по крайней мере два варианта:

1 Используйте указатели

Это вариант, который вы, похоже, хотите использовать с помощью NULL и прочее ... если человек для книги действительно является необязательным, вы можете сделать указатель (или даже лучше, shared_ptr или какой-либо другой умный указатель) из человека член, чтобы дать государству «человек не установлен», например

class Book { 
    string title; 
    std::shared_ptr<Person> person; 
    void getPerson(std::shared_ptr<Person> p) { 
     return person = p; 
    } 

    std::shared_ptr<Person> getPerson() { 
     return person; 
    } 
}; 

Вы будете иметь доступ к членам этого человека с -> то хотя (например, давайте предположим, что человек имеет конструктор, имя, и getName функцию :) - конечно, вы должны будете быть старайтесь не разыскивать неуправляемый указатель так же, как и с необработанными указателями (или со ссылками на Java, откуда мне кажется, что вы можете исходить?).

Book b1; 
// ... set Person ... 
b1.setPerson(std::make_shared<Person>("John")); 

Затем вы можете проверить, если человек установлен просто путем проверки Его по умолчанию оператора в в станде :: shared_ptr, как это:

// somewhere in Book class: 
if (person) ... 

2 "Пусто" соглашение

Составьте соглашение о том, что означает, что человек может быть отключен (например, когда имя пуст, это «по умолчанию», то есть неустановленный человек). Тогда вы можете просто проверить в классе Book:

if (person.getName().empty()) ... 

Обратите внимание, однако, что с помощью этой опции вы больше шансов столкнуться с проблемами, когда ваши Person изменения класса, так как он теперь тесно связан в Book класса. Например. в какой-то момент вам может потребоваться, чтобы имя Человека фактически было установлено на построение, вам также придется изменить свою логику в книге.

0

Он вернет все ваши конструкторы по умолчанию Person.

1

Как упоминалось ранее, будет вызываться конструктор по умолчанию класса Person. в случае, если вы не создали свой собственный конструктор (вызывается конструктор по умолчанию) и не инициализировали никаких членов экземпляра в конструкторе, члены будут содержать значения, которые были в памяти, когда произошло выделение памяти. (., Так как он выделяется в стеке)

В этом случае он просто будет содержать мусор в стеке

0
class Book 
{ 
private: 
    Person p1; 
public: 
    Book() 
    { } 

    friend bool operator== (const Book& b, const Person& p) 
    { 
     return &b.p1 == &p; 
    } 
}; 
Смежные вопросы