Значение неинициализированного поля в классе

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()? Как проверить, имеет ли это поле значение или нет? Я хочу проверить, имеет ли книга назначенное лицо, если нет, тогда назначьте человека.

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

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

Спасибо!

Теги:
class
pointers
return

4 ответа

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"));

Затем вы можете проверить, установлен ли человек, просто проверив по умолчанию bool-оператор std :: shared_ptr, например:

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

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

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

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

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

1

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

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

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

    friend bool operator== (const Book& b, const Person& p)
    {
        return &b.p1 == &p;
    }
};
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню