У вас есть по крайней мере два варианта:
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
класса. Например. в какой-то момент вам может потребоваться, чтобы имя Человека фактически было установлено на построение, вам также придется изменить свою логику в книге.
'Книга' имеет' Лицо', которое получает по умолчанию. Это объект, и он вряд ли будет сопоставим с «NULL», который используется для выражения нулевого указателя. – juanchopanza
Чтобы добавить к @juanchopanza, ваши конструкторы 'Book' должны включать логику для вызова и инициализации конструкторов' Person' в той или иной форме. – nhgrif
Это то, что вы сделали бы в JAVA. В C++, если вы не объявляете что-то в качестве указателя, вы также не можете назначить ему NULL. человек * не * указатель в вашем классе, вместо этого ваш книжный класс непосредственно содержит объект человека, и поэтому он также не может ben ull – codeling