2016-11-25 3 views
-1

У меня есть базовый класс Employee и производный класс, называемый EmployeeMerit. Класс Employee считывает данные из входного текстового файла и устанавливает идентификаторы переменных, JobClass, Years и ED для входных значений.В C++, как установить приватную переменную в производном классе на входное значение из базового класса?

Класс EmployeeMerit должен добавить дополнительную переменную, называемую MeritRank, и установить ее на дополнительное входное значение (уже содержащееся в файле) из входного файла. Если MeritRank установлен в 3, тогда заработная плата должна увеличиться на 50 долларов. Переменная зарплата - это защищенный член, что означает, что он используется обоими классами.

У меня есть MeritRank в классе EmployeeMerit, заданном как частный член. Класс Employee имеет функцию readData, которая устанавливает переменные в соответствии с входным файлом.

Как это:

void Employee::readData(ifstream& inf){ 
    inf >> ID >> Job_class >> Years >> Ed; 
} 

Использование MeritRank, которая является частной в классе EmployeeMerit, как я установил, что переменная к следующему входу? Это то, о чем я думал. Но когда я запускаю программу, MeritRank не изменяет значение. Имейте в виду, что я не могу использовать классы друзей или общедоступные переменные.

void EmployeeMerit::addToSalary(ifstream& inf) { 
    employee::readData(inf);  //Base class function 
    inf >> MeritRank;  //MeritRank is supposed to be set to next input # 
    if (MeritRank == 3) { 
     sal = sal + 50.0; 
    } 
} 
+0

Используйте отладчик, чтобы выполнить свой код, по одной строке за раз. Изучите входной поток и убедитесь, что он не находится в состоянии ошибки в результате сбоя синтаксического анализа, что приведет к сбою оператора '>>'. Узнайте, как использовать отладчик. Знание того, как использовать отладчик, является обязательным навыком для каждого разработчика на C++. –

ответ

0

Похоже, вам необходимо прочитать все данные, используя один вызов функции с клиентской стороны. Make readData a virtual участник функция.

// Make it virtual in the declaration. 
void Employee::readData(ifstream& inf){ 
    inf >> ID >> Job_class >> Years >> Ed; 
} 

// Overide the the derived class. 
void EmployeeMerit::readData(ifstream& inf) { 
    Employee::readData(inf); 
    inf >> MeritRank; 
    if (MeritRank == 3) { 
     sal = sal + 50.0; 
    } 
} 

Теперь клиенты могут просто вызвать readData на объекте. Не нужно будет звонить readData, а затем следует позвонить addToSalary.

+0

Благодарим за отзыв. Но, может быть, я не был ясен. sal является защищенной переменной. Меня беспокоит MeritRank, который не изменяется с помощью входных значений в базовом классе. Должен ли я отправлять больше кода? – user7912

+0

@ user7912, см. Обновленный ответ. Это может сработать для вас. –

+0

Я все еще получаю одинаковые результаты. Возможно, inf >> MeritRank не читает ввода: / – user7912

Смежные вопросы