-1

デフォルトのクラス コンストラクターを使用して複数の新しいクラス オブジェクトを作成するにはどうすればよいですか?

プロジェクトでは、3 つのクラス オブジェクトをファイルに書き込むプログラムを作成する必要があります。私がやったこと...次の部分は、readData関数を使用してデータを3つの別々のクラスオブジェクトに読み戻し、データを表示できるようにすることです。これを行う方法が完全にわからなくなったので、 readData 関数にコードがありません。

以下は、ファイルに書き込まれているときのオブジェクトの外観の例です。

employee name(21, "first last", "45 East State", "661-9000", 30, 12.00);

これが私のコードの大部分です。従業員クラスはかなり基本的ですが、デフォルトのクラス コンストラクターは次のとおりです。

employee::employee ();
employee::employee(int locEmpNumber, string locName, string locaddress, string locphone, double locHrWorked, double locHrWage)



#include "employee.h" 
#include <string>
#include <iomanip>
#include <iostream>
#include <fstream>
using namespace std;

void writeData (const employee& e);
void readData (const employee& e);
void printCheck (const employee& e);


int main( )
{
//Declarations
const int ONE = 1;
const int TWO = 2;

int userInput;

cout << "This program has two options:" << endl;
cout << "1 - Create a data files called 'EmployeeInfo.txt', or" << endl;
cout << "2 - Read data from a file and print paychecks." << endl;
cout << "Please enter (1) to create a file or (2) to print checks: ";

cin >> userInput;

if (userInput == ONE)
{
    //Create employee objects:
    employee joe(37, "Joe Brown", "123 Main St.", "123-6788", 45, 10.00);
    employee sam(21, "Sam Jones", "45 East State", "661-9000", 30, 12.00);
    employee mary(15, "Mary Smith", "12 High Street", "401-8900", 40, 15.00);

    ofstream empFile ("EmployeeInfo.txt");

    //Employee objects to write themselves out to the file.
    writeData(joe);
    writeData(sam);
    writeData(mary);

    //Close the file.
    empFile.close();

    //Print an message that creation of the file is complete.
    system("CLS");
    cout << "\nCreation of 'EmployeeInfo.txt' has completed.\n";
    cout << "\nYou can now run option 2.\n";

    //Exit.
    system("PAUSE");
    return 0;
}
else if (userInput == TWO)
{
    //Create three new Employee objects, using the default Employee constructor.

    //Open the file that you just saved.

    //Have each object read itself in from the file.

    //Call the printCheck( ) function for each of the three new objects, just as you did in the previous project.
}
else
{
    system("CLS");      
    cout << "Incorrect entry.... Please try again and follow directions closely! \n" << endl;
    system("PAUSE");
    return 0;
}


}

void writeData(const employee& e)
{
fstream empFile;
empFile.open ("EmployeeInfo.txt", ios::app);

empFile << e.getEmpNumber() << "\n";
empFile << e.getName() << "\n";
empFile << e.getAddress() << "\n";
empFile << e.getPhone() << "\n";
empFile << e.getHrWorked() << "\n";
empFile << e.getHrWage() << "\n";
}

void readData(const employee& e)
{
fstream empFile;    
empFile.open ("EmployeeInfo.txt", ios::in);

if(empFile.fail())
{
    cout << "File could not be open. Please try option 1 then option 2.\n" << endl; 
    return;
}

}
4

1 に答える 1

0

問題を解決するためにあなたが努力したことは良いことです。ただし、質問で設定した内容とコード内の一部のコメントとの間に不一致があります。あなたのブリーフの重要な部分は、従業員オブジェクト自体がファイルに書き込み、ファイルから読み戻すことができる必要があることです。

オブジェクト自体をファイルに書き込むのではなく、オブジェクトの内容をファイルに書き込むコードを記述しました。私はこれについて髪を分割しているように見えるかもしれませんが、これがオブジェクト指向プログラミングの本質です。オブジェクト自体に機能をカプセル化することが、ここでの真の目標です。

あなたを助けるために、以下にいくつかのコードを含めました。うまくいけば、これはあなたにとって良い意味を持ちます。

class employee
{
private:
    int _locEmpNumber;
    std::string _locName;
    std::string _locAddress;
    std::string _locPhone;
    double _locHrWorked;
    double _locHrWage;

public:
    employee();
    employee(int locEmpNumber, std::string locName, std::string locAddress, std::string locPhone, double locHrWorked, double locHrWage);

    //object should be able to save itself as per your project brief.
    void writeData(std::ofstream &empFile);

    //object should be able to read itself from file as per your project brief
    void readData(std::ifstream &empFile);
};

employee::employee()
{
    _locEmpNumber = 0;
    _locHrWorked = _locHrWage = 0;
}


employee::employee(int locEmpNumber, std::string locName, std::string locAddress, std::string locPhone, double locHrWorked, double locHrWage)
{
    _locEmpNumber = locEmpNumber;
    _locName = locName;
    _locAddress = locAddress;
    _locPhone = locPhone;
    _locHrWorked = locHrWorked;
    _locHrWage = locHrWage;
}

//
//From what I can glean from your brief ...
//Employee objects to write themselves out to the file!!!
void employee::writeData(std::ofstream &empFile)
{
    empFile << _locEmpNumber << std::endl;
    empFile << _locName << std::endl;
    empFile << _locAddress<< std::endl;
    empFile << _locPhone << std::endl;
    empFile << _locHrWorked << std::endl;
    empFile << _locHrWage << std::endl;
}

//
//Again, from what I can glean from your brief ...
//Have each object read itself in from the file!!!
void employee::readData(std::ifstream &empFile)
{
    //Normally you would have error handling in a method like this and
    //would either return a response that indicates that the operation
    //succeded or failed. You might alternatively use exception handling
    //or indeed a combination of both.
    //
    //Normally you would reset all members to initial / empty values before
    //reading values into them from your file. In this case we will omit that
    //for the purposes of simplicity. The main reason you would reset members
    //is to ensure that when reusing an object you don't end up with partial
    //data from the current "read" operation mixed with partial data that
    //was already in the object before you started reading.
    std::string inputStr;
    std::getline(empFile, inputStr);
    _locEmpNumber = atoi(inputStr.c_str());
    std::getline(empFile, _locName);
    std::getline(empFile, _locAddress);
    std::getline(empFile, _locPhone);
    std::getline(empFile, inputStr);
    _locHrWorked = atof(inputStr.c_str());
    std::getline(empFile, inputStr);
    _locHrWage = atof(inputStr.c_str());
}


int main(int argc, char* argv[])
{
    //Declarations
    const int ONE = 1;
    const int TWO = 2;

    int userInput;

    std::cout << "This program has two options:" << std::endl;
    std::cout << "1 - Create a data files called 'EmployeeInfo.txt', or" << std::endl;
    std::cout << "2 - Read data from a file and print paychecks." << std::endl;
    std::cout << "Please enter (1) to create a file or (2) to print checks: ";

    std::cin >> userInput;

    if (userInput == ONE)
    {
        //Create employee objects:
        employee joe(37, "Joe Brown", "123 Main St.", "123-6788", 45, 10.00);
        employee sam(21, "Sam Jones", "45 East State", "661-9000", 30, 12.00);
        employee mary(15, "Mary Smith", "12 High Street", "401-8900", 40, 15.00);

        std::ofstream empFile ("EmployeeInfo.txt");

        //Employee objects to write themselves out to the file.
        joe.writeData(empFile);
        sam.writeData(empFile);
        mary.writeData(empFile);
//      writeData(joe);
//      writeData(sam);
//      writeData(mary);

        //Close the file.
        empFile.close();

        //Print an message that creation of the file is complete.
        system("CLS");
        std::cout << "\nCreation of 'EmployeeInfo.txt' has completed.\n";
        std::cout << "\nYou can now run option 2.\n";

        //Exit.
        system("PAUSE");
        return 0;
    }
    else if (userInput == TWO)
    {
        //Create three new Employee objects, using the default Employee constructor.
        employee joe;
        employee sam;
        employee mary;

        //Open the file that you just saved.
        std::ifstream empFile("EmployeeInfo.txt");

        //Have each object read itself in from the file.
        joe.readData(empFile);
        sam.readData(empFile);
        mary.readData(empFile);

        empFile.close();

        //Call the printCheck( ) function for each of the three new objects, just as you did in the previous project.

        //I'll leave it to you to add this yourself.
    }
    else
    {
        system("CLS");      
        std::cout << "Incorrect entry.... Please try again and follow directions closely! \n" << std::endl;
        system("PAUSE");
        return 0;
    }
    return 0;
}
于 2013-06-02T10:29:41.940 に答える