Не вызывается функция класса в main c++

185
24 июня 2018, 19:50

Намучался с классом. Надо описать класс "Работник", Каждая запись содержит фамилия и инициалы, должность, год поступления на работу, зарплата. Сделать вывод всех работников, ну и поиск по определенным запросам, тип по должности и тд. Разберите пожалуйста весь код и скажите где-что, в классах много взаимосвязи, что уже путаюсь сам код, там помечу где ошибка:

 #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

Answer 1
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)
{
   //Пустое тело
}

Ну в общем как-то так. В общем не опускайте руки и учитесь) Надеюсь что понятно объяснил.

Answer 2

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/

READ ALSO
Как преобразовать QString в std::string?

Как преобразовать QString в std::string?

Я пытался сделать так:

214
Почему вектор не доступен в дебаге

Почему вектор не доступен в дебаге

Почему содержимое вектора недоступно в дебаге? Вывод вектора корректный

180