основной файл
Код:
#include <iostream>
#include "footballer.h"
using namespace std;
int main()
{
attacking A;
///A.footballer::print(); /// напрямую не сработает. надо приводить А к классу footballer, и только тогда вызывать функцию
A.print();
transform(A); /// transform не является членом класса attacking
quarterback B;
B.print();
std::cout<<std::endl; /// переход на новую строку
system("pause");
return 0;
}
footballer.h
Код:
class footballer {
protected: /// Использовать protected вместо private, если нужен доступ из дочерних классов. Согласно идеологии ООП нужно доступ осуществлять через Get-функции
char * surname;
char * team;
float rost;
float weight; //вес
public:
footballer( char * nameDef ="Name", char *teamDef ="team", float rostDef=0.0, float weightDef=0.0); /// добавить имена для переменных, значения по-умолчанию свести в конструктор, если не заданы иные
footballer(const footballer &A);
footballer & operator=(const footballer & A); //опер присваивания
~footballer();
void print()const; /// зачем const
void setrost();
void setweight();
};
class attacking: public footballer
{
private:
unsigned short mastery;
int gol;
public:
attacking( unsigned short masteryDef=12, int golDef=2, char *nameDef ="Name 2 ", char *teamDef ="team ",float rostDef=175.1,float weightDef=69.5);
attacking(const attacking & A);
friend void transform( const attacking & A);
attacking & operator=(const attacking & A);
~attacking();
void print()const;
void setgol();
};
class quarterback: public footballer {/// надо определить тип наследования(в данном случае public)
private:
int matches;
int victory;
public:
quarterback( int matchesDef=1, int victoryDef=0, char *nameDef ="Name 3" , char *teamDef ="team ", float rostDef=170.8 , float weightDef=75.0);
quarterback( const quarterback & A);
quarterback & operator=(const quarterback & A);
~quarterback();
void setmatches(); /// зачем const
void setvictory();
};
void transform( const attacking &A);
footballer.cpp
Код:
#include <iostream>
#include "footballer.h"
using namespace std;
footballer::footballer(char *nameDef, char *teamDef, float rostDef, float weightDef)
///:surname(a),team(b) /// это что вообще такое?)
{
surname=new char[strlen(nameDef)+1];
strcpy(surname, nameDef); /// первый параметр показывает куда копировать, второй - откуда
team=new char[strlen(teamDef)+1];
strcpy(team, teamDef);
weight=weightDef;/// в конструкторе надо не забывать инициализировать переменные
rost=rostDef;
}
footballer::footballer(const footballer &A)
{
surname = new char[strlen(A.surname)+1];
strcpy(surname,A.surname);
team= new char[strlen(A.team)+1];
strcpy(team,A.team);
weight=A.weight;
rost=A.rost;
}
footballer::~footballer()
{
delete[]surname;
delete[]team;
}
footballer & footballer ::operator=(const footballer & A)
{
if (this!=&A)
{
/// удалить surname и team, если они были созданы до этого
surname=new char[strlen(A.surname)+1]; /// это действие только создает массив,
team=new char[strlen(A.team)+1]; /// но не копирует в него значение(сделать как в конструкторе копий)
weight=A.weight;
rost=A.rost;
}
return *this;
}
void footballer::setrost()
{
cout<<"\n Enter rost";
cin>>rost;
}
void footballer::setweight()
{
cout<<"\n Enter weight";
cin>>weight;
}
void footballer::print()const
{
cout<<"footballer:"<<surname<<"rost"<<rost<<"weight"<<weight<<"team"<<team;
}
///////////////////////////////////
attacking::attacking( unsigned short masteryDef, int golDef, char *nameDef, char *teamDef,float rostDef,float weightDef):footballer(nameDef, teamDef, rostDef, weightDef)
{
mastery=masteryDef;
gol=golDef;
}
attacking::attacking(const attacking & A):footballer(A)
{
mastery=A.mastery;
gol=A.gol;
}
attacking::~attacking(){}
attacking & attacking:: operator=(const attacking & A)
{
if (this!=&A)
{
mastery=A.mastery;
gol=A.gol;
}
return *this;
}
void attacking::setgol()
{
gol++;
}
void attacking::print()const
{
cout<<"footballer:"<<surname<<"mastery"<<mastery<<"gol"<<gol;
}
////////////////////////////////////////
quarterback::quarterback (int matchesDef, int victoryDef, char *nameDef, char *teamDef, float rostDef, float weightDef):footballer(nameDef, teamDef, rostDef, weightDef)
{ matches=matchesDef;
victory=victoryDef;
}
quarterback::quarterback( const quarterback & A):footballer(A)
{
matches=A.matches; /// копипаст - зло))
victory=A.victory;
}
quarterback::~quarterback(){}
quarterback & quarterback:: operator=(const quarterback & A)
{
if (this!=&A)
{
matches=A.matches;/// копипаст - зло))
victory=A.victory;
}
return *this;
}
void quarterback::setmatches() /// названия функций должны совпадать с хидером
{
matches++;/// копипаст - зло))
}
void quarterback::setvictory()
{
victory++;
}
void transform( const attacking &A)
{
cout<<endl<<"enter mastersto quarterback";
unsigned short newMastery;
cin>>newMastery; /// mastery приватный член класса и доступ к нему невозможен.
/// A.mastery = newMastery; /// надо создать функцию void SetMastery(unsigned short newMastery) в public области и в ней присваивать новое значение
}
Мои комментарии после "///". В этих же строках исправления. Сравнивай со своим кодом.
Этот код компилируется и выполняется, но причесывать там еще очень и очень много)