C ++ Virtual Void

时间:2017-09-18 09:32:42

标签: c++ pointers virtual void

好的,所以我有一个名为employee的父类和3个子类叫做manager,研究员和工程师。我做了一个矢量,想要列出它们。这就是我如何处理制作。

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

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

我在制作矢量时没有问题,我关心的是列出信息。所有3个子类都有firstnamelastnamesalary,但它们的不同之处在于它们具有唯一的不同数据成员,例如Manager具有{{1} } intvacation的{​​{1}}值Engineer依此类推。

Employee.h

int

Employee.cpp

experience

主要

#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

我在#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; } 函数上收到错误。

它说没有#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"); } 匹配这些操作数 binary'&lt;&lt;':找不到带有void等类型右手操作数的运算符。

1 个答案:

答案 0 :(得分:1)

问题是getInfo的返回类型为void,并且您尝试将该返回值放入cout。

了解代码std::cout << val实际调用函数operator<<(ostream& out, const objectType& val)非常重要,其中objectType是&#39; val&#39;的类型。

在你的情况下,类型是无效的,并且根本没有operator<<的实现将void作为一个类型。因此错误&#34;没有找到哪个操作符采用了类型为void的右手操作数...&#34;。

为了解决您的问题,您有以下几种选择:

  1. view()更改为

    for (...)
    {
      EmployeeDB[x]->getInfo();
    }
    
  2. 更改getInfo()以返回字符串您想要的信息:

    std::string getInfo()
    {
      std::string info;
      info =...
      return info;
    }
    
  3. 为员工创建operator<<并更改视图以将其调用:

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