У меня есть ошибка с использованием этого-> в C ++

0

У меня возникают проблемы с использованием this->, поскольку он говорит, что на него можно ссылаться только в нестатической функции-члене. У меня также возникает проблема с переменной = null, поскольку она говорит, что "=" неоднозначна.

//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 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)
{
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**; //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); //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 member.

Вот ошибки:

 Main.cpp
\\psf\home\documents\visual studio 2010\projects\csci112\lab3project\lab3project\main.cpp(31): error C2059: syntax error : ']'
 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(38): error C2355: 'this' : can only be referenced inside non-static member functions
\\psf\home\documents\visual studio 2010\projects\csci112\lab3project\lab3project\employee.cpp(38): error C2227: left of '->LastName' must point to class/struct/union/generic type
\\psf\home\documents\visual studio 2010\projects\csci112\lab3project\lab3project\employee.cpp(39): error C2355: 'this' : can only be referenced inside non-static member functions
\\psf\home\documents\visual studio 2010\projects\csci112\lab3project\lab3project\employee.cpp(39): error C2227: left of '->FirstName' must point to class/struct/union/generic type
\\psf\home\documents\visual studio 2010\projects\csci112\lab3project\lab3project\employee.cpp(40): error C2355: 'this' : can only be referenced inside non-static member functions
\\psf\home\documents\visual studio 2010\projects\csci112\lab3project\lab3project\employee.cpp(40): error C2227: left of '->Salary' must point to class/struct/union/generic type
\\psf\home\documents\visual studio 2010\projects\csci112\lab3project\lab3project\employee.cpp(55): error C2109: subscript requires array or pointer type
Теги:

3 ответа

3
Лучший ответ

Member FirstName - это экземпляр std::string (object), поэтому попытка присвоить ему NULL не имеет смысла.

Также обратите внимание, что для определения функции-члена в другом месте (а не там, где оно было объявлено), вы должны использовать
имя класса в качестве префикса:

string Employee::setFirstName(string FirstName)
{
    ...
}

А также обратите внимание, что ваш конструктор может быть упрощен к этому (используя список инициализации):

Employee (string FirstName, string LastName, float Salary)
  : FirstName(FirstName), LastName(LastName), Salary(Salary) { }
  • 0
    Мой профессор просто хочет, чтобы у нас был конструктор, который инициализирует три элемента данных: имена должны быть инициализированы пустой строкой, а оклад должен быть 0,0.
  • 1
    @BrettHolmes: нет такой вещи, как пустая строка, просто пустая строка, которая в этом случае будет создана по умолчанию, если вы не укажете ее явно.
Показать ещё 3 комментария
2

Объявление класса:

class Employee {
public:
    string FirstName;
    string LastName;
...
    string EmployeeSearch(string LastName[], string SearchName);
    void DisplayEmployee (string DisplayFirstName, string DisplayLastName, string DisplaySalary);
    Employee();
};

Реализация класса:

string 
Employee::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;
    ...

Без синтаксиса "Employee ::" "EmployeeSearch() - это отдельная функция, не имеющая никакого отношения к вашему классу Employee.

ТАКЖЕ:

**FirstName = NULL и **this->LastName** ошибочны.

Если "Firstname" является членом строки, вы можете просто ссылаться на него по имени. Аналогично, если ReadFile() является функцией-членом (Employee :: ReadFile), тогда вам не нужно "this->".

  • 0
    если я это исправлю, то все равно будет сказано, что это нестатическая функция-член.
  • 0
    Если вы внутри Employee :: Readfile (): WRONG: MyinFile >> **this->LastName**; ; ПРАВИЛЬНО: MyinFile >> LastName; , Q: это помогает?
0

  • Поместите все члены данных в частном порядке, что обеспечит инкапсуляцию и что о ООП.
  • Создайте функцию Get и Set для каждого частного участника, чтобы вы могли получить к ней доступ
  • Когда вы объявляете строку, ее значением по умолчанию будет пустая строка, поэтому вам не нужно устанавливать ее равной нулю
  • Для функции set она не возвращает никакого значения, поэтому она должна быть недействительной.
  • Для функции get, поскольку она возвращает и не изменяет значение, вы должны поместить за ней ключевое слово const.
  • Для построения вы можете установить параметры, равные частным членам, и не нужно вызывать функции набора.
  • Функции чтения, поиска и отображения должны быть помещены в основной, а не в класс Employee. Это будет легче поддерживать.

Employee.h

class Employee
{
    private:
    std::string FirstName;
    std::string LastName;
    float Salary;
    public:
    Employee() {}
    Employee(std::string newFirstName, std::string newLastName, float newSalary);
    std::string GetFirstName() const {return FirstName;}
    std::string GetLastName() const {return LastName;}
    float GetSalary() const {return Salary;}
    void SetFirstName(string val) {FirstName = val;}
    void SetLastName (string val) {LastName = val;}
    void SetSalary(float val) {Salary = val;}
};

Employee.cpp

Employee::Employee(std::string newFirstName, std::string newLastName, float newSalary)
{
    FirstName = newFirstName;
    LastName = newLastName;
    Salary = newSalary;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню