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()? Как проверить, имеет ли это поле значение или нет? Я хочу проверить, имеет ли книга назначенное лицо, если нет, тогда назначьте человека.
bool isPerson(Person _person, Book _book) {
if (_book.getPerson() == NULL) {
_book.setPerson(_person);
return true;
}
else {
return false;
}
Это то, что я хотел сделать, но == NULL неверен.
Спасибо!
У вас есть как минимум два варианта:
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"));
Затем вы можете проверить, установлен ли человек, просто проверив по умолчанию bool-оператор std :: shared_ptr, например:
// somewhere in Book class:
if (person) ...
2 "Пустое" соглашение
Составьте соглашение о том, что означает, что человек может быть отключен (например, когда имя пуст, это "по умолчанию", то есть неустановленный человек). Затем вы можете просто проверить класс книги:
if (person.getName().empty()) ...
Обратите внимание, однако, что с этой опцией вы, скорее всего, столкнетесь с проблемами, когда ваш класс Person
изменится, так как теперь он тесно связан с классом Book
. Например, в какой-то момент вам может потребоваться, чтобы имя Person фактически было установлено в конструкции, вам также придется изменить свою логику в книге.
Как упоминалось ранее, будет вызываться конструктор по умолчанию класса Person. в случае, если вы не написали свой собственный конструктор (вызывается конструктор по умолчанию) и не инициализировали каких-либо членов экземпляра в конструкторе, члены будут содержать значения, которые были в памяти, когда произошло выделение памяти.
В этом случае он просто будет содержать мусор в стеке (поскольку он выделен в стеке).
class Book
{
private:
Person p1;
public:
Book()
{ }
friend bool operator== (const Book& b, const Person& p)
{
return &b.p1 == &p;
}
};
Он вернет все ваши конструкторы по умолчанию Person
.