将数组从类传递到main

Pass array from class to main

本文关键字:main 数组      更新时间:2023-10-16

我正试图在一个单独的类文件中创建一个由10个Employee对象组成的数组,然后从我的main访问它。我有三个单独的档案。Employee.cpp、Employee.h和EmployeeArray10.h

Employee.cpp显然是主要的,Employee.h持有Employee()类的构造函数、getter和setter,EmploloyeeArray10.h是创建由十个Employee()对象组成的数组的地方。我遇到的问题是,我如何从main()创建和访问EmployeeArray10.h文件中创建的数组,从而在EmployesArray10.h中创建的对象上使用employee()类中的tostring()函数

我已经盯着这个看了好几个小时了,如有指导,不胜感激。如果这还不够清楚,请告诉我。

#include <iostream>
#include <string>
#include "Employee.h"
#include "EmployeeArray10.h"
using namespace std;
int main(){
    Employee employee1;
    Employee employee2(001, "Rob", "Address");
    Employee employee3(002, "Tom", "The Street", "Science Dept", 25000.00, "99-CW-4753");
    employee1.tostring();
    employee2.tostring();
    employee3.tostring();
    EmployeeArray10 employeeArray;
    for(int i=0; i <=10; i++){
        employeeArray[i].EmployeeArray10.Employee.tostring();
    }
    return 0;
}

员工.h:

#include <iostream>
#include <string>
using namespace std;
class Employee
{
private:
int number;
string name;
string address;
string department;
double salary;
string regNumber;

// CONSTRUCTOR METHODS
public:
Employee()
{
    setNumber(0);
    setName("");
    setAddress("");
    setDepartment("");
    setSalary(0.0);
    setRegNumber("");
}
Employee(int pNum, string pName, string pAddress)
{
    setNumber(pNum);
    setName(pName);
    setAddress(pAddress);
    setDepartment("");
    setSalary(0.0);
    setRegNumber("");
}
Employee(int pNum, string pName, string pAddress, string pDepartment, double pSalary, string pRegNumber)
{
    setNumber(pNum);
    setName(pName);
    setAddress(pAddress);
    setDepartment(pDepartment);
    setSalary(pSalary);
    setRegNumber(pRegNumber);
}
// SET METHODS
void setNumber(int pNum)
{
    number = pNum;
}
void setName(string pName)
{
    name = pName;
}
void setAddress(string pAddress)
{
    address = pAddress;
}
void setDepartment(string pDepartment)
{
    department = pDepartment;
}
void setSalary(double pSalary)
{
    salary = pSalary;
}
void setRegNumber(string pRegNumber)
{
    regNumber = pRegNumber;
}
// GET METHODS
int getNumber()
{
    return number;
}
string getName()
{
    return name;
}
string getAddress()
{
    return address;
}
string getDepartment()
{
    return department;
}
double getSalary()
{
    return salary;
}
string getRegNumber()
{
    return regNumber;
}
// MISC METHODS
void tostring()
{
    cout << "nnEmployee ObjectnNumber: " << number <<
    "nName: " << name <<
    "nAddress: " << address <<
    "nDepartment: " << department <<
    "nSalary: " << salary <<
    "nTax payable: " << taxPayable(salary) <<
    "nCar reg. no.: " << regNumber <<"nn";
}
double taxPayable(double mSalary){
    double result = 0;
    if (mSalary <= 20000 && mSalary >=1){
        result = mSalary * 0.2;
    }
    else if(mSalary > 20000){
        result = (20000 * 0.2) + ((mSalary - 20000) * 0.4);
    }
    return result;
}

};

员工阵列10.h

#include <iostream>
#include <string>
using namespace std;
class EmployeeArray10{
public:
EmployeeArray10(){
    Employee *newEmpArray = new Employee[10];
        for(int i=0; i <=10; i++){
            newEmpArray[i].setNumber(i+1);
        }
}

};

这在很多方面都有很多缺陷,我甚至不知道从哪里开始,但我会为您说明一些基本错误,以便开始学习。你可能想查找我强调的单词:

  1. 类EmployeeArray10没有成员变量。它只有一个构造。没有meber变量意味着它不能有任何状态或存储任何内容
  2. 构造函数分配内存,从不将指向它的指针存储在任何位置。这意味着存在内存泄漏
  3. 在标题中,您包含了从未在其中使用过的标准标题。为什么
  4. 在相同的标头中,您有using指令。千万不要在头文件中这样做。它会将名称空间溢出整个项目,使名称空间实际上毫无用处
  5. 您将方式定义为许多getter和setter封装是有原因的,您可以通过使所有内容都可访问来打破它
  6. 在两个for循环中,从0循环到10,包括10。这意味着你试图访问只有10个成员的11个成员。阅读你选择的初学者课本中的循环
  7. toString()是一个函数的名称,该函数将某些内容转换为字符串。在你的情况下,它会做一些不同的事情。给你的函数起一个有意义的名字,而不是误导性的名字
  8. 线employeeArray[i].EmployeeArray10.Employee.tostring();根本没有意义:

    • EmployeeArray10没有operator[],所以employeeArray[i]没有意义。我假设您希望访问该数组中的第I个Employee
    • Employee没有成员变量EmployeeArray10,所以employeeArray[i].EmployeeArray10没有意义
    • employeeArray[i].EmployeeArray10.Employee相同
    • 也许你指的是employeeArray[i].tostring(),但人们只能猜测。编译器做不到,所以他会逃跑

老实说,整个代码看起来像是从其他地方复制粘贴的代码,没有完全理解你(或代码)在做什么。你应该读一本关于语言基本概念的好书,然后循序渐进。

三个词:使用成员变量。

EmployeeArray10类不会返回指向其创建的数组的指针,因此无法从构造函数外部访问(因此也无法删除,这意味着内存泄漏)。

构造函数也不能有返回类型。您需要为EmployeeArray10编写一个解构函数来修复内存泄漏,然后编写一个返回数组指针的函数,以便您可以在类外实际使用它。

坦率地说,如果可以的话,只需使用现代C++工具,比如std::vector<Employee>