Следуя предложению πάντα ῥεῖ, вот один из способов сделать это, изменив ваш дизайн как можно меньше:
1) Создайте перегруженный оператор, не являющийся членом <<, для вашего класса rolodex: </p>
std::ostream& operator<< (std::ostream& os, const rolodex& rol)
{
os << rol.name << ":" << std::endl
<< "\t" << rol.street << std::endl
<< "\t" << rol.town << std::endl
<< "\t" << rol.state << std::endl
<< "\t" << rol.zip << std::endl
<< "\t" << rol.phone << std::endl;
return os;
}
.. но компилятор упрекнет вас за попытку доступа к закрытым членам (по умолчанию члены являются личными) вне класса, поэтому вам придется немного ослабить правила:
class rolodex
{
...
public:
...
friend std::ostream& operator<< (std::ostream& os, const rolodex& rol);
};
Вы не можете иметь оператор << внутри самого класса, см. <a href="/6263036/rabotaet-li-operator-peregruzki-vnutri-klassa"> делает-перегрузка-оператор-работает-внутри-класса .
Однако, это почти всегдалучший дизайн, чтобы добавить функции получения в ваш публичный интерфейс в любом случае.У вас будет get_name()
и т. Д. В разделе public:
вашего класса def, эти функции первоначально будут просто возвращать значения переменных закрытого члена, и тогда ваш оператор << сможет использовать их вместо попытки доступа к закрытым членам.Теперь вам больше не требуется декларация <code>friend.
Я проголосовал Замечание какого-то программиста о вашем дизайне
Код, позволяющий пользователю вводить данные действительноне должно быть внутри класса rolodex, потому что это затрудняет повторное использование класса.Изображение, которое хочет повторно использовать ролодекс из графического интерфейса, например, и не очень хорошая идея, чтобы ролодекс содержал экземпляры самого себя внутри вектора.
Я бы предложил
1) Класс Person, содержащий все атрибуты человека, с общедоступными геттерами get_name()
и сеттерами set_name()
, которые не используют конкретный метод ввода, просто примите данные в качестве аргументов, например set_name(std::string& name)
.
2) оператор не являющийся членом << для вывода человека в выходной поток </p>
3) класс Rolodex с приватным std::vector<Person>
и методы для добавления человека, записи всех людей в выходной поток и т. д...
Удачи и наслаждайтесь: -)
Редактировать: структуру меню на терминале ИМХО следует оставить внутри функции main () или инкапсулировать в другой класс.Но, конечно, не оставляй это в Ролодексе или еще хуже, Перс.