2017-02-21 7 views
0

Так что было немного сложно сформулировать этот вопрос в названии.Оценка, если указатель указателя существует для значения «n»

В принципе, у меня есть класс «Человек». Этот человек указывает на наставника через эту функцию

void Person::setMentor(Person* person) { 
// bunch of conditions 
mentor = person; 
} 

Одно из моих условий должны быть, что может быть максимум 4 уровня человека-наставника. Так что я хотел бы проверить, если

person->getMentor() 

существует, и если он делает три раза более, то иерархия является слишком большим, и этот метод будет возвращать ошибку. Любые идеи, как я делаю это более элегантно, чем писать все это в гигантской строке?

+0

Почему вы хотите установить лимит на количество наставников? В реальной жизни нет ничего, что ограничивало бы способность кого-то наставника иметь наставника. Возможно, что связь является круговой (например, человек A является наставником для B, является наставником для C, является наставником для A). Лучше бы справиться с такими случаями, а не накладывать произвольную глубину на связи. – Peter

ответ

1

Что вы имеете в основном связанный список, можно перебирать и проверить:

int depth; 
for (depth = 0; depth < MENTOR_LIMIT; depth++) { 
    if ((person = person->getMentor()) == NULL) { 
     break; 
    } 
} 
if (depth >= MENTOR_LIMIT) { 
    // return error 
} 
1

Учитывая

Person person; 
person.mentor = new Person; 
person.mentor->mentor = new Person; 
person.mentor->mentor->mentor = new Person; 

следующий код

auto countMentors(const Person& person) 
{ 
    std::size_t count = 0; 
    for(auto p = &person; p->getMentor() != nullptr; p = p->getMentor()) 
    { 
     ++count; 
    } 

    return count; 
} 

вернется 3.

 Смежные вопросы

  • Нет связанных вопросов^_^