2016-05-09 2 views
-1

Я должен сделать класс AddressBook, содержащий класс Person. Моя программа почти работает, за исключением случаев, когда я добавляю человека, она не запоминает ее в следующей итерации меню Command, а Display All появляется «В вашей адресной книге 0 человек». Что не так с моим кодом?Программа не сохраняет введенные записи? (C++)

#include <iostream> 
#include <string> 

using namespace std; 

class AddressBook { 

public: 
    class Person 
    { 
    public: 
     char firstName[15]; 
     char lastName[15]; 
     char personID[15]; 
    }; 

    Person entries[100]; 

    unsigned int total; 

    AddressBook() 
    { 
     total = 0; 
    } 

    void AddPerson() 
    { 
     cout << "This is entry number " << (total + 1) << " in your address book. " << endl; 

     cout << "What shall we put for the first and last name? Limit both to under 15 characters. Example: Bob Smith" << endl; 
     cin >> entries[total].firstName >> entries[total].lastName; 

     cout << "What is " << entries[total].firstName << " " << entries[total].lastName << "'s ID code?" << endl; 
     cin >> entries[total].personID; 

     ++total; 
     cout << "..." << endl << "Successfully Added." << endl; 
    }; 

    void DisplayPerson(int i) 
    { 
     cout << "Entry " << i + 1 << ": " << endl; 
     cout << "FIRST NAME: " << entries[i].firstName << endl; 
     cout << "LAST NAME: " << entries[i].lastName << endl; 
     cout << "ID: " << entries[i].personID << endl; 
    }; 

    void DisplayEveryone() 
    { 
     cout << "You have " << total << " People in your address book." << endl; 

     for (int i = 0; i < total; ++i) 
      DisplayPerson(i); 
    }; 


    void SearchPerson() 
    { 
     char lastname[32]; 
     cout << "Please enter the last name of the person you wish to find." << endl; 
     cin >> lastname; 

     for (int i = 0; i < total; ++i) 
     { 
      if (strcmp(lastname, entries[i].lastName) == 0) 
      { 
       cout << "Person Found. " << endl; 
       DisplayPerson(i); 
       cout << endl; 
      } 
     } 
    }; 




}; 


int main() { 
    char command; 
    bool Exit = false; 

    while (Exit == false) 
    { 
     AddressBook Address_Book; 
     cout << "---------------COMMANDS---------------" << endl; 
     cout << "A: Add Person To Address Book" << endl; 
     cout << "S: Search for Person in Address Book" << endl; 
     cout << "D: Display Everyone In Address Book" << endl << endl; 

     cout << "Type the letter of your command: "; 
     cin >> command; 
     cout << endl; 
     switch (command) { 
     case 'A': 
     case 'a': 
      Address_Book.AddPerson(); 
      break; 
     case 'S': 
     case 's': 
      Address_Book.SearchPerson(); 
      break; 
     case 'D': 
     case 'd': 
      Address_Book.DisplayEveryone(); 
      break; 
     default: 
      cout << "That is not a valid command. Closing Address Book." << endl; 

      cout << endl; 
     } 
    } 
} 
+0

Предоставьте [MCVE], пожалуйста. –

+0

Вопрос для OP - Что произойдет, если у меня будет более 100 записей? – PaulMcKenzie

ответ

2

Причина заключается в том, что вы создаете новую адресную книгу в каждой итерации цикла в то время как и выбросить его в конце итерации:

Это

AddressBook Address_Book; 

создает новый адресная книга, которая «отбрасывается», когда вы достигаете ее конца (т. е. конца цикла).

В действительности, вы покупаете новую адресную книгу, когда хотите сделать новую запись? Нет. Сначала вы покупаете книгу, а затем (возможно, в цикле while) добавляете записи. Переместите вышеприведенную линию за пределы цикла.

+0

Для получения дополнительной информации: https://en.wikipedia.org/wiki/Scope_(computer_science) – user4581301

1

Ваша проблема заключается в декларации вашей адресной книги.

Изменить его на следующее:

AddressBook Address_Book; 

while (Exit == false) { 
    //Ask for input and respond. 
} 

В версии Address_Book объявлен в начале цикла while. Это означает, что каждый раз, когда итерация цикла завершается, и выполнение возвращается к началу блока, создается новый локальный объект Address_Book, который не знает данных предыдущих объектов.