Member 13345206 Ответов: 2

Нет ошибки компиляции, но есть некоторая проблема передачи аргумента из дочернего класса. пожалуйста, помогите мне


#include<iostream>
#include<string>
using namespace std;
class student{
	
	protected:
		string name;
	int age;
	public:
		student(){
		}
      student(string n,int a){
      	name=n;
      	age=a;
	  }	
	  void input()
	  {
	  	cin>>name>>age;
	  }
	  void display()
	  {
	  	cout<<"name:"<<name<<"\n"<<"age:"<<age<<"\n";
	  }
};
class teacher:public student
{
	string course;
	public:
		teacher():student()
		{
		}
		teacher(string n,int a,string c){
			student(n,a);
			course=c;
		}
		void input()
		{
			student::input();
			cin>>course;
		}
		void display()
		{
			student::display();
			cout<<"course:"<<course<<"\n";
		}
};
int main()
{
	student st;
	cout<<"Enter name and age of Student\n";
	st.input();
	cout<<"Student details:\n";
	st.display();
	
	teacher tr("SRI",50,"BE");
	cout<<"Teacher details:\n";
	tr.display();
	return 0;
}


Что я уже пробовал:

не получая имя класса ребенка и возраст

2 Ответов

Рейтинг:
14

Jochen Arndt

Ошибка заключается в том, что teacher конструктор, принимающий параметры:

teacher(string n,int a,string c) 
{
    student(n,a);
    course=c;
}
Там вы создаете локальную student экземпляр из параметров, но это выходит за рамки области действия при выходе из конструктора, позволяя членам unitialized.

Вы должны сделать это таким образом:
teacher(string n,int a,string c) : student(n,a)
{
    course=c;
}


Рейтинг:
0

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но к более ранним стадиям вы придете позже): тестирование и отладка.

Начните с рассмотрения того, что он делает и чем это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а он удваивает его и печатает ответ, то если ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его-он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он где-то здесь:
private int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить почему. Поставить точку останова на строке:
st.input();

и запустите свое приложение. Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она на самом деле делала, когда вы использовали кнопку "шаг вперед" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он совершенствуется только при использовании!

Да, я, наверное, мог бы сказать вам, в чем "проблема" - но сделать это самому несложно, и при этом вы узнаете что-то действительно стоящее!