Намучался с классом. Надо описать класс "Работник", Каждая запись содержит фамилия и инициалы, должность, год поступления на работу, зарплата. Сделать вывод всех работников, ну и поиск по определенным запросам, тип по должности и тд. Разберите пожалуйста весь код и скажите где-что, в классах много взаимосвязи, что уже путаюсь сам код, там помечу где ошибка:
#include <iostream>
#include <conio.h>
#include <cstring>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
class Worker {
public:
Worker(string family="" , string inicial="" , string dolzh="" , int year=0 , double zp=0 );
void printListEmployees(size_t);
void printListEmployeesOverYear(int);
void printListEmployeesOverSalary(double);
void printListEmployeesThisPosition(string);
~Worker();
string family;
string inicial;
string dolzh;
int year;
double zp;
};
/*========================== KONSTRUKTOR ==========================*/
Worker::Worker(string family , string inicial , string dolzh , int year , double zp )
{
cout<<"Введите фамилию работника "; cin>>family;
cout<<"Введите инициалы работника "; cin>>inicial;
cout<<"Введите должность работника "; cin>>dolzh;
cout<<"Введите год поступления на работу "; cin>>year;
cout<<"Введите зарплату работника "; cin>>zp;
}
Worker::~Worker()
{
};
/*========================== FUNCTION ==========================*/
void printListEmployees(Worker* workers, size_t count) // печать списка сотрудников
{
int n;
for (int i=0; i<n; i++)
{
cout<<workers[i].family;
}
delete[] workers;
}
/*========================== MAIN ==========================*/
int main()
{
setlocale(LC_ALL, "Rus");
int n;
cout<<"Задайте количество работников"; cin>>n;
Worker *workers = new Worker[n];
Worker s;
cout<<s.printListEmployees();// вот тут не вызывается, выдает ошибку. снизу напишу.
}
ошибка In function 'int main()': [Error] no matching function for call to 'Worker::printListEmployees()' [Note] candidate is: [Note] void Worker::printListEmployees(size_t) [Note] candidate expects 1 argument, 0 provided
void printListEmployees(Worker* workers, size_t count);
Во-первых, этот метод не является членом класса вы его определили и реализовали вне класса. Во-вторых, сигнатура метода объявленная в классе отличается от сигнатуры вызова, сравните:
//Один параметр в объявлении метода
void printListEmployees(size_t);
...
//При вызове не один параметр не передается
cout<<s.printListEmployees();
На что компилятор и ругается.
В-третьих, сама функция printListEmployees()
возвращает void а не строку поэтому строка cout<<s.printListEmployees();
не корректна. Вам следует вместо этого вызвать printListEmployees(workers, n);
В-четвертых, у Вас внутри класса Worker объявлены следующий методы:
void printListEmployees(size_t);
void printListEmployeesOverYear(int);
void printListEmployeesOverSalary(double);
void printListEmployeesThisPosition(string);`
Вы можете их удалить, так как не очень логично что какой-то один работник может выводить информацию о списке работников. Здесь вы можете объявить метод для вывода информации о работнике например:
string info();
И реализовать его так:
string Worker::info()
{
// Здесь реализация....
}
Вы можете использовать это в функции
void printListEmployees(Worker* workers, size_t count) // печать списка
сотрудников
{
int n;
for (int i=0; i<n; i++)
{
cout<<workers[i].info();
}
delete[] workers;
}
Получается что Worker s
Вам не нужен. Если уж хотите использовать какой-то класс для этого то создайте какой-нибудь Company
в котором хранится список все сотрудников Worker
и который может вывести информацию о них методом printListWorkers()
.
UPDATE
Забыл написать про конструктор. В классе поля можете объявить через нижнее подчеркивание:
//...
string _family;
string _inicial;
//...
Сам конструктор реализовать так:
//Используем список инициализации
Worker::Worker(string family="" , string inicial="" , string dolzh="" , int year=0 , double zp=0) :
_family(family),
_inicial(inicial),
_dolzh(dolzh),
_year(year),
_zp(zp)
{
//Пустое тело
}
Ну в общем как-то так. В общем не опускайте руки и учитесь) Надеюсь что понятно объяснил.
1.Меняем
Worker(string family="" , string inicial="" , string dolzh="" , int year=0 , double zp=0 );
на
Worker(string family="" , string inicial="" , string dolzh="" , int year=0 , double zp=0 )
{
this.family = family;
this.inicial = inicial;
this.dolzh = dolzh;
this.year = year;
this.zp = zp;
}
2.И делаем так
Worker s = new Worker(); // в скобочках можете параметры передать,в порядке как
//указано в конструкторе
3. Вызываем
cout << s.Print() ;
Реализация вашей функции Print должна возвращать строковое значение
UPD: Вся подробная и понятная информация о классах в си++ здесь:
http://cppstudio.com/post/439/
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Почему содержимое вектора недоступно в дебаге? Вывод вектора корректный
макс элемент нашел, а как переприсвоить не знаю