2013-08-24 5 views
2

В настоящее время я работаю над небольшим количеством кода, который будет искать в векторе типа Person (который я определил в коде и покажу, если потребуется). Если он найдет человека, он вернет свое имя. В настоящее время это работает, но если он не находит человека, он должен вернуть указатель Null. Проблема в том, что я не могу понять, как заставить его возвращать указатель Null! Это просто приводит к сбою программы каждый раз.Как вернуть нулевой указатель в функцию C++

Код:

Person* lookForName(vector<Person*> names, string input) 
{ 
    string searchName = input; 
    string foundName; 
    for (int i = 0; i < names.size(); i++) { 
     Person* p = names[i]; 
     if (p->getName() == input) { 
      p->getName(); 
      return p; //This works fine. No problems here 
      break; 
     } else { 
      //Not working Person* p = NULL; <---Here is where the error is happening 
      return p; 
     } 
    } 
} 
+0

Только возвращение '0' (ноль). Это представление нулевого указателя в C++. –

+3

'nullptr' будет лучше, но серьезно, используйте' std :: find_if' и предпочтительно 'std :: vector ' без указателя. – chris

+0

О, а также вы не инициализировали P, так что почти в любом случае это имело бы значение! = 0. Помните, что C++ не инициализирует свои переменные автоматически. –

ответ

2

Вы можете использовать std::find_if алгоритм:

Person * lookForName(vector<Person*> &names, const std::string& input) 
{ 
    auto it = std::find_if(names.begin(), names.end(), 
       [&input](Person* p){ return p->getName() == input; }); 


    return it != names.end() ? *it : nullptr; // if iterator reaches names.end(), it's not found 
} 

Для C++ 03 версия:

struct isSameName 
{ 
    explicit isSameName(const std::string& name) 
    : name_(name) 
    { 
    } 

    bool operator()(Person* p) 
    { 
     return p->getName() == name_; 
    } 
    std::string name_; 
}; 

Person * lookForName(vector<Person*> &names, const std::string& input) 
{ 
    vector<Person*>::iterator it = std::find_if(names.begin(), names.end(), 
          isSameName(input)); 


    return it != names.end() ? *it : NULL; 
} 
+0

Спасибо за идею! Один быстрый Q, хотя, я вставил этот код вместо моего существующего кода, и он приходит с «ошибкой:« он »не называет тип». Должен ли я удалить часть кода? или мне нужно объявить его где-то еще? – Silmarilos

+0

@Silmarilos: Кажется, что вы компилируете компилятор C++ 03 или иначе в режиме C++ 03. Вышеприведенное решение зависит от некоторых возможностей C++ 11, а именно: 'aut' type, lambdas и' nullptr'. Вы можете развернуть цикл вручную или определить функтор вне линии (вне функции), чтобы использовать 'std :: find_if' –

+0

Получил это! Спасибо миллион за помощь! – Silmarilos

0

Похоже, вы просто должны вернуться Null, nullptr или 0.

codeproject

0

Просто используйте следующий код:

return NULL; 
1

Если имя, которое вы ищете, не находится в первом элементе, тогда вы не ищете в r est элементов.

Вам нужно сделать что-то вроде -

for (int i = 0; i<names.size(); i++){ 
    Person* p = names[i]; 
    if (p->getName() == input) { 
     return p; 

     // Placing break statement here has no meaning as it won't be executed. 
    } 
} 

// Flow reaches here if the name is not found in the vector. So, just return NULL 
return NULL; 

Как предложил Крис, попробуйте использовать std::find_if алгоритм.

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