Решение задачи ООП (С++)? Задача: Напишите программу создания базы данных некоторого магазина ткани который еще торгует и пряжей. Создайте класс, в котором хранится названия и цена. От этого класса наследуется еще 2 класса: первый содержит информацию о производителе ткани,а второй содержит информацию о составе пряжи и метрах в мотке. В каждом из трех классов должен быть метод getdata через который можно получить данные от пользователя с клавиатуры и метод позволяющий выполнить вывод данных на экран. Мой код. Как в класс-наследник для функции getdata() получить данные из функции getdata класса-родителя?class shop { protected: int n1, n2, *price1, *price2; char **cloth, **yarn; public: ~shop() { delete [] price1; delete [] price2; for (int i=0; i<n1; i++) delete [] cloth[i]; for (int i=0; i<n2; i++) delete [] yarn[i]; } void getdata() { cout<>n1; price1=new int[n1]; cloth=new char*[n1]; for (int i=0; i<n1; i++) cloth[i]=new char[20]; cout<<"Input name of cloth and price of it:\n"; for (int i=0; i>cloth[i]>>price1[i]; cout<>n2; price2=new int[n2]; yarn=new char*[n2]; for (int i=0; i<n2; i++) yarn[i]=new char[20]; cout<<"Input name of yarn and price of it:\n"; for (int i=0; i>yarn[i]>>price2[i]; } void outdata() { cout<<"In stock shop has the following products at a following price:\n"; for (int i=0; i<n1; i++) cout<<cloth[i]<<" "<<price1[i]<<endl; for (int i=0; i<n2; i++) cout<<yarn[i]<<" "<<price2[i]<<endl; } }; class shop_cloth:public shop { char **fabricator; public: ~shop_cloth() { for (int i=0; i<n1; i++) delete [] fabricator[i]; } void getdata() { fabricator=new char*[n1]; for (int i=0; i<n1; i++) fabricator[i]=new char[20]; cout<<"Input the fabricators of cloth:\n"; for (int i=0; i<n1; i++) { cout<<cloth[i]<>fabricator[i]; } } void outdata() { cout<<"The fabricators of cloth:\n"; for (int i=0; i<n1; i++) cout<<cloth[i]<<" "<<fabricator[i]; } }; class shop_yarn:public shop { char **consist; int *length; public: ~shop_yarn() { delete [] length; for (int i=0; i<n2; i++) delete [] consist[i]; } void getdata() { consist=new char*[n2]; for (int i=0; i<n2; i++) consist[i]=new char[20]; length=new int[n2]; cout<<"Input the consist and the length of yarn:\n"; for (int i=0; i<n2; i++) { cout<<yarn[i]<>consist[i]>>length[i]; } } void outdata() { cout<<"The consist ant the length of yarn:\n"; for (int i=0; i<n1; i++) cout<<yarn[i]<<" "<<consist[i]<<" "<<length[i]; } }; void main() { shop ob; ob.getdata(); shop_cloth ob1; shop_yarn ob2; ob1.getdata(); ob2.getdata(); cout<
Ошибка в вашем коде заключается в том, что вы не вызываете getdata() из класса-родителя в класс-наследник. Для этого необходимо явно вызывать метод getdata() из класса-родителя в конструкторе класса-наследника.
Вот пример исправленного кода:
class shop { protected: int n1, n2, *price1, *price2; char** cloth; char** yarn; public: ~shop() { delete[] price1; delete[] price2; for (int i = 0; i < n1; i++) delete[] cloth[i]; for (int i = 0; i < n2; i++) delete[] yarn[i]; } void getdata() { // your code to get data from the user } void outdata() { // your code to output data } }; class shop_cloth : public shop { char** fabricator; public: ~shop_cloth() { for (int i = 0; i < n1; i++) delete[] fabricator[i]; } void getdata() { shop::getdata(); // call base class getdata() method fabricator = new char*[n1]; for (int i = 0; i < n1; i++) fabricator[i] = new char[20]; // your code to get fabricator data from the user } void outdata() { // your code to output fabricator data } }; class shop_yarn : public shop { char** consist; int* length; public: ~shop_yarn() { delete[] length; for (int i = 0; i < n2; i++) delete[] consist[i]; } void getdata() { shop::getdata(); // call base class getdata() method consist = new char*[n2]; for (int i = 0; i < n2; i++) consist[i] = new char[20]; length = new int[n2]; // your code to get consist and length data from the user } void outdata() { // your code to output consist and length data } }; int main() { shop ob; ob.getdata(); shop_cloth ob1; ob1.getdata(); shop_yarn ob2; ob2.getdata(); // your code to output data from all objects return 0; }
В этом исправленном коде метод getdata() из класса-родителя вызывается в каждом из классов-наследников, чтобы получить данные из базового класса.
Ошибка в вашем коде заключается в том, что вы не вызываете getdata() из класса-родителя в класс-наследник. Для этого необходимо явно вызывать метод getdata() из класса-родителя в конструкторе класса-наследника.
Вот пример исправленного кода:
class shop{
protected:
int n1, n2, *price1, *price2;
char** cloth;
char** yarn;
public:
~shop()
{
delete[] price1;
delete[] price2;
for (int i = 0; i < n1; i++)
delete[] cloth[i];
for (int i = 0; i < n2; i++)
delete[] yarn[i];
}
void getdata()
{
// your code to get data from the user
}
void outdata()
{
// your code to output data
}
};
class shop_cloth : public shop
{
char** fabricator;
public:
~shop_cloth()
{
for (int i = 0; i < n1; i++)
delete[] fabricator[i];
}
void getdata()
{
shop::getdata(); // call base class getdata() method
fabricator = new char*[n1];
for (int i = 0; i < n1; i++)
fabricator[i] = new char[20];
// your code to get fabricator data from the user
}
void outdata()
{
// your code to output fabricator data
}
};
class shop_yarn : public shop
{
char** consist;
int* length;
public:
~shop_yarn()
{
delete[] length;
for (int i = 0; i < n2; i++)
delete[] consist[i];
}
void getdata()
{
shop::getdata(); // call base class getdata() method
consist = new char*[n2];
for (int i = 0; i < n2; i++)
consist[i] = new char[20];
length = new int[n2];
// your code to get consist and length data from the user
}
void outdata()
{
// your code to output consist and length data
}
};
int main()
{
shop ob;
ob.getdata();
shop_cloth ob1;
ob1.getdata();
shop_yarn ob2;
ob2.getdata();
// your code to output data from all objects
return 0;
}
В этом исправленном коде метод getdata() из класса-родителя вызывается в каждом из классов-наследников, чтобы получить данные из базового класса.