-4

我认为我正确地声明了所有内容,但我在 main.cpp 的第 22-26 行中得到了未声明的标识符。我也得到这个 = 在我的employee.cpp 的第 12-16 行中是模棱两可的。在employee.cpp 的第55 行,我还有一个奇怪的表达式必须有指向薪水对象类型的指针。我真的很感激任何帮助,因为我的学校目前没有导师。

//Employee.h

using namespace std;

class Employee {
private:
public:
    string FirstName;
    string LastName;
    string DisplayFirstName;
    string DisplayLastName;
    string DisplaySalary;
    string SearchName;
    float Salary;
    Employee( string FirstName, string LastName, float Salary )
    {
            setFirstName(FirstName);
            setLastName(LastName);
            setSalary(Salary);
    }
    string setFirstName(string FirstName);
    string setLastName(string LastName);
    float setSalary(float Salary);
    void ReadFile(ifstream& MyinFile, string FirstName, string LastName, float Salary);
    string EmployeeSearch(string LastName[], string SearchName);
    void DisplayEmployee (string DisplayFirstName, string DisplayLastName, string DisplaySalary);
    Employee();
};

//Employee.cpp

#include <iostream>
#include <fstream>
#include <string>
#include "Employee.h"

using namespace std;

string setFirstName(string FirstName)
{
**FirstName = NULL;** //ambiguous error
}
string setLastName(string LastName)
{
**LastName = NULL;** //ambiguous error
}
float setSalary(float Salary)
{
Salary = 0.0;
}
void ReadFile(ifstream& MyinFile, string FirstName, string LastName, float Salary)
{
char exit_char;
int MaxSize;
int count = 0;

MyinFile.open("employee.dat"); 
    if (!MyinFile)
    {    //no
        cout << "Can't open input file." << endl; //Tests the right file.
        char exit_char;                         //End Program
        cout << "Press any key to exit" << endl;
        cin >> exit_char;
    }
    for(count = 0; count < MaxSize; count++)
    {
        MyinFile >> LastName[count];
        MyinFile >> FirstName[count];
        MyinFile >> **Salary[count];** //error
    }
MyinFile.close();
}
string EmployeeSearch(string LastName[], string FirstName[], float Salary, string SearchName, string DisplayFirstName, string DisplayLastName, string DisplaySalary)
{
    cout << "Please enter the name of the employee you would like to search." <<  endl;
    cin >> SearchName;

    for (int i = 0; i < 10; i++ )
    {
        if (LastName[i] == SearchName)
    {
        DisplayFirstName = FirstName[i];
        DisplayLastName = LastName[i];
        DisplaySalary = **Salary[i];**  //error
    }
    else 
        cout << "Could not find employee." << endl;
    }
};
void DisplayEmployee (string DisplayFirstName, string DisplayLastName, string DisplaySalary)
{
cout << DisplayFirstName << "   ";
cout << DisplayLastName << "    ";
cout << DisplaySalary << endl;
};

//Main.cpp
#include <iostream>
#include <fstream>
#include <string>
#include "Employee.h"

using namespace std;

const int MaxSize = 100;

int main()
{
char Redo;          //Input a character to redo the program
ifstream MyinFile;
cout << "Your Salary Machine\n\n";
Employee  Employee;
Employee.ReadFile(**MyinFile, FirstName, LastName, Salary**); //undeclared identifier error
do
{
    Employee.EmployeeSearch(**LastName[], SearchName**); //undeclared identifier error
    Employee.DisplayEmployee(**DisplayFirstName,DisplayLastName,DisplaySalary**); //undeclared identifier error
    //Asks user if they want redo the program
    cout << "Would you like to redo the program?\n";
    cout << "Please enter Y or N: \n";
    cin >> Redo;
}while(Redo == 'Y' || Redo == 'y');

return 0;
}

编写该程序以读取具有名字和姓氏的文件,然后是薪水,然后能够输入文件中任何人的姓氏,它将显示姓名和薪水,然后重复。我假设使用构造函数将名字和姓氏初始化为 NULL,然后将薪水初始化为 0.0。我还应该使用 get 和 set 成员函数。

以下是错误:

------ Build started: Project: Lab3Project, Configuration: Debug Win32 ------
Main.cpp
\\psf\home\documents\visual studio 2010\projects\csci112\lab3project\lab3project\main.cpp(22): error C2065: 'FirstName' : undeclared identifier
 \\psf\home\documents\visual studio 2010\projects\csci112\lab3project\lab3project\main.cpp(22): error C2065: 'LastName' : undeclared identifier
\\psf\home\documents\visual studio 2010\projects\csci112\lab3project\lab3project\main.cpp(22): error C2065: 'Salary' : undeclared identifier
\\psf\home\documents\visual studio 2010\projects\csci112\lab3project\lab3project\main.cpp(25): error C2065: 'SearchName' : undeclared identifier
\\psf\home\documents\visual studio 2010\projects\csci112\lab3project\lab3project\main.cpp(25): error C3861: 'LastName': identifier not found
\\psf\home\documents\visual studio 2010\projects\csci112\lab3project\lab3project\main.cpp(26): error C2065: 'DisplayFirstName' : undeclared identifier
\\psf\home\documents\visual studio 2010\projects\csci112\lab3project\lab3project\main.cpp(26): error C2065: 'DisplayLastName' : undeclared identifier
\\psf\home\documents\visual studio 2010\projects\csci112\lab3project\lab3project\main.cpp(26): error C2065: 'DisplaySalary' : undeclared identifier

Employee.cpp
\\psf\home\documents\visual studio 2010\projects\csci112\lab3project\lab3project\employee.cpp(12): error C2593: 'operator =' is ambiguous
      c:\program files\microsoft visual studio 10.0\vc\include\xstring(772): could be  'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(_Elem)'
      with
      [
          _Elem=char,
          _Traits=std::char_traits<char>,
          _Ax=std::allocator<char>
      ]
      c:\program files\microsoft visual studio 10.0\vc\include\xstring(767): or       'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(const _Elem *)'
      with
      [
          _Elem=char,
          _Traits=std::char_traits<char>,
          _Ax=std::allocator<char>
      ]
      while trying to match the argument list '(std::string, int)'
 \\psf\home\documents\visual studio 2010\projects\csci112\lab3project\lab3project\employee.cpp(16): error C2593: 'operator =' is ambiguous
      c:\program files\microsoft visual studio 10.0\vc\include\xstring(772): could be 'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(_Elem)'
      with
      [
          _Elem=char,
          _Traits=std::char_traits<char>,
          _Ax=std::allocator<char>
      ]
      c:\program files\microsoft visual studio 10.0\vc\include\xstring(767): or       'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(const _Elem *)'
      with
      [
          _Elem=char,
          _Traits=std::char_traits<char>,
          _Ax=std::allocator<char>
      ]
      while trying to match the argument list '(std::string, int)'
\\psf\home\documents\visual studio 2010\projects\csci112\lab3project\lab3project\employee.cpp(40): error C2109: subscript requires array or pointer type
\\psf\home\documents\visual studio 2010\projects\csci112\lab3project\lab3project\employee.cpp(55): error C2109: subscript requires array or pointer type
4

2 回答 2

2
  • 看起来你需要做很多工作来改进你的代码。首先,您应该将所有头文件放在 Employee.h 中。这在您决定包含 Employee.h 的任何地方都会很有用,它的所有头文件也将包含在内,因此您不必再次包含它们。
  • 在 C++ 中,您可以将变量定义为指针或引用。请了解指针(*pointer)、双指针 **doublepointer)也称为数组指针、引用(&reference)和变量(variable)的区别。您还应该了解如何取消引用指针,例如指针 (**pointer)。
  • 了解类、函数或变量定义及其声明之间的区别。这对于您当前的分配问题尤其重要。
  • 你有一个 Employee 类,如果你是初学者;头文件用于构造函数、析构函数、成员变量和成员函数定义。而 .cpp 文件用于构造函数、成员函数和非成员函数声明。大多数时候,析构函数的声明不包含任何内容,但是这是您删除指针的地方。
  • 在 C++ 中,您必须管理内存,否则您的指针会导致内存泄漏。因此,每当您定义一个指针 (*pointer) 时,您都应该在析构函数中将其删除。您的头文件中缺少析构函数。你需要定义一个。
  • 您应该像这样在头文件中定义和/或声明构造函数。在构造函数中调用 SetFirstName()、setLastName()、setSalary() 确实没有意义。这些方法只能在 MAIN 类中使用。要设置类成员变量,请执行此操作。

    Employee( string FirstName, string LastName, float Salary )
    this.FirstName = FirstName;
    this.LastName = LastName;
    this.Salary = Salary;
    

    }

  • 包含一个类析构函数

    ~Employee(){
    }
    
  • 您的 SET 函数仅用于设置成员变量,不应返回任何内容。而不是返回一个字符串,它们应该是无效的。像这样。

  • 设置函数定义。

    无效 setFirstName(字符串名字);
    无效 setLastName(字符串姓氏);
    无效 setSalary(浮动工资);

  • 定义和声明 GET 函数。

    string getFirstName() { return FirstName;}
    string getLastName() { return LastName;}
    float getSalary() { return Salary;}

  • 在您的 .cpp 文件中,您应该在 Employee 类中定义的其他成员函数中声明您的集合函数。像这样。

    void Employee::setFirstName(string FirstName){
    FirstName = FirstName;
    }
    void Employee::setLastName(string LastName){
    LastName = LastName;
    }
    void Employee::setSalary(float Salary){
    Salary = Salary;
    }

  • 此 Readfile 函数读取此格式示例的文件;第一行; John Garry 100.50,下一行;Michael Shawn 250.80 等并将其存储在员工向量中。

    typedef std::vector < Employee > EmployeeType
    EmployeeType 账户;

    void ReadFile(ifstream& MyinFile, string FirstName, string LastName, float Salary) {
    string st;
    浮动 n;

    while(MyinFile >> st) {
    this.setFirstName(st);
    this.setLastName(MyinFile >> st);
    this.setSalary(MyinFile >> n);
    account.push_back(this);
    }

  • 搜索员工功能。它仅按名字搜索。

  • 您还应该了解 C++ 中的数组和数组指针。

    字符串员工::员工搜索(字符串姓氏,字符串名字){

    cout << "请输入您要搜索的员工姓名。" <<endl;
    cin >> 搜索名称;
    string st = "没有这样的员工";
    字符串 s = " ";

    雇员 *雇用;

    for(int i = 0; i < account.size(); i++){
    雇用 = account.at(i);
    if(SearchName ==employ->getFirstName()){
    std::cout <<employ->getFirstName()<<""<<employ->getLastName()<<""<<employ->getSalary()< <结束;
    st = "";

    st.append(employ.getFirstName());
    st.append(s);
    st.append(employ.getLastName());
    st.append(s);

    std::ostringstream ss;
    ss << 雇佣.getSalary();
    字符串 so(ss.str());
    st.append(so);
    返回圣;
    }
    } 返回圣;

    }

于 2013-10-08T23:36:40.517 回答
1

查看 main.cpp 中的这一行:

Employee.ReadFile(**MyinFile, FirstName, LastName, Salary**); //undeclared identifier error

FirstNameLastName和是从哪里来Salary的?它们从未在int main(). 这就是您有未声明的标识符错误的原因。

我不确定为什么您的Employee::ReadFile成员函数采用最后三个参数。它应该从文件中读取并设置this.FirstName等,而不是已传递给函数的参数。

这应该会让你走上正确的轨道:

// In header file, replace ReadFile prototype with:
void ReadFile(ifstream& MyinFile);

// In implementation file, replace ReadFile with:

void ReadFile(ifstream& MyinFile)
{
    char exit_char;
    int MaxSize;
    int count = 0;

    MyinFile.open("employee.dat"); 
        if (!MyinFile)
        {    //no
            cout << "Can't open input file." << endl; //Tests the right file.
            char exit_char;                         //End Program
            cout << "Press any key to exit" << endl;
            cin >> exit_char;
        }
        for(count = 0; count < MaxSize; count++)
        {
            MyinFile >> this->LastName;
            MyinFile >> this->FirstName;
            MyinFile >> this->Salary;
        }
    MyinFile.close();
    }

// In main.cpp, replace the current call to Employee.ReadFile with:
Employee.ReadFile(MyinFile);

这可能不会解决您的所有问题,但这是一个开始。

于 2013-10-08T21:43:45.643 回答