简体   繁体   中英

C++ Virtual Void

Okay, so I have a parent class called employee and 3 subclass called manager,researcher and engineer. I made a vector and want to list them. this is the how I process the making.

vector <Employee*,Manager*> EmployeeDB;
Employee *temp;

temp = new Manager(first, last, salary, meetings, vacations);
EmployeeDB.push_back(temp);

I have no problem in making the vector, my concern is listing the info. all 3 subclasses have firstname , lastname and salary but they're difference is that they have different data members which is unique, example the Manager has the int value vacation and the Engineer has the int value experience so on and so forth.

Employee.h :

#include <iostream>
#include <string>
using namespace std;

#ifndef EMPLOYEE_h
#define EMPLOYEE_h

class Employee
{
public:
    Employee();
    Employee(string firstname, string lastname, int salary);
    string getFname();
    string getLname();
    int getSalary();

    virtual void getInfo();

private:
    string mFirstName;
    string mLastName;
    int mSalary;

};
#endif

Employee.cpp :

#include "Employee.h"

#include <iostream>
#include <string>
using namespace std;

Employee::Employee()
{
    mFirstName = "";
    mLastName = "";
    mSalary = 0;
}

Employee::Employee(string firstname, string lastname, int salary)
{
    mFirstName = firstname;
    mLastName = lastname;
    mSalary = salary;
}

string Employee::getFname()
{
    return mFirstName;
}

string Employee::getLname()
{
    return mLastName;
}

int Employee::getSalary()
{
    return mSalary;
}

void Employee::getInfo()
{
    cout << "Employee First Name: " << mFirstName << endl;
    cout << "Employee Last Name: " << mLastName << endl;
    cout << "Employee Salary: " << mSalary << endl;
}

Main :

#include <vector>
#include <iostream>
#include <string>

#include "Employee.h"
#include "Engineer.h"
#include "Manager.h"
#include "Researcher.h"
using namespace std;

vector <Employee*> EmployeeDB;
Employee *temp;

void add()
{
    int emp, salary, vacations, meetings, exp, c;
    string first, last, type, school, topic;
    bool skills;

    do
    {
        system("cls");
        cout << "===========================================" << endl;
        cout << "               Add Employee                " << endl;
        cout << "===========================================" << endl;
        cout << "[1] Manager." << endl;
        cout << "[2] Engineer." << endl;
        cout << "[3] Researcher." << endl;
        cout << "Input choice: ";
        cin >> emp;
        system("cls");
    } while (emp <= 0 || emp > 3);

    cout << "===========================================" << endl;
    cout << "              Employee  Info               " << endl;
    cout << "===========================================" << endl;
    cout << "Employee First name: ";
    cin >> first;
    cout << "Employee Last name: ";
    cin >> last;
    cout << "Employee Salary: ";
    cin >> salary;

    switch (emp)
    {
    case 1:
        cout << "Employee numbers of meetings: ";
        cin >> meetings;
        cout << "Employee numbers of vacations: ";
        cin >> vacations;

        temp = new Manager(first, last, salary, meetings,vacations);
        EmployeeDB.push_back(temp);
        delete temp;

        break;
    case 2:
        cout << endl;
        cout << "[1]YES    [2]NO" << endl;
        cout << "Employee C++ Skills: ";
        cin >> c;
        if (c == 1)
        {
            skills = true;
        }
        else
        {
            skills = false;
        }

        cout << "Employee Years of exp: ";
        cin >> exp;
        cout << "(e.g., Mechanical, Electric, Software.)" << endl;
        cout << "Employee Engineer type: ";
        cin >> type;

        temp = new Engineer(first, last, salary, skills, exp, type);
        EmployeeDB.push_back(temp);
        delete temp;
        break;
    case 3:
        cout << "Employee School where he/she got his/her PhD: ";
        cin >> school;
        cout << "Employee Thesis Topic: ";
        cin >> topic;

        temp = new Researcher(first, last, salary, school, topic);
        EmployeeDB.push_back(temp);
        delete temp;
        break;
    }
}

void del()
{

}

void view()
{
    for (int x = 0; x < (EmployeeDB.size()); x++)
    {
        cout << EmployeeDB[x]->getInfo();
    }
}

void startup()
{

    cout << "===========================================" << endl;
    cout << "             Employee Database             " << endl;
    cout << "===========================================" << endl;
    cout << "[1] Add Employee." << endl;
    cout << "[2] Delete Employee." << endl;
    cout << "[3] List Employees." << endl;
    cout << "[4] Exit." << endl;
    cout << "Please Enter Your Choice: ";
}

int main(int argc, char** argv)
{
    bool flag = true;
    int choice;

    do {
        do 
        {
            system("cls");
            system("pause>nul");
            startup();
            cin >> choice;
        } while (choice < 0 || choice >4);

        switch (choice)
        {
        case 1:
            add();
            break;
        case 2:
            del();
            break;
        case 3:
            view();
            break;
        case 4:
            flag = false;
            system("EXIT");
            break;
        }
    } while (flag == true);

    return 0;
    system("pause>nul");
}

I am getting error on the view() function.

It says no operator<< matches these operands binary '<<': no operator found which takes a right hand operand of type void etc etc.

The problem is that the getInfo has return type void and you are trying to put that return value into cout.

It's important to understand that the code std::cout << val actually calls the function operator<<(ostream& out, const objectType& val) where objectType is the type of 'val'.

In your case the type is void, and there is simply no implementation of operator<< that takes void as a type. hence the error "no operator found which takes a right hand operand of type void...".

In order to fix your issue you have a few options:

  1. Change view() to be

     for (...) { EmployeeDB[x]->getInfo(); } 
  2. Change getInfo() to return a string the info as you'd like:

     std::string getInfo() { std::string info; info =... return info; } 
  3. Create an operator<< for Employee and change view to call it:

     view() { for (...) { std::cout << EmployeeDB[x]; } } 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM