С++ programming Task 3 OOP
Здравейте , имам следния проблем с 3-тата задача..Когато искам да направя поинтър към Person object успявам да го сетна, но когато искам да взема owner-a не ми се получава .... Поствам и целия код ако може някакви съвет . Благодаря предварително
class Person
{
public:
Person(){}
Person(uint8_t age, string name) :m_age(age), m_name(name)
{
m_idGener = s_idGenerator++;
}
int getId()
{
return m_idGener;
}
uint8_t getAge()
{
return m_age;
}
string getName()
{
return m_name;
}
private:
string m_name;
uint8_t m_age;
static int s_idGenerator;
int m_idGener;
};
class Cars:public Person
{
public:
Person *m_owner; // нарочно е публично за да може да тествам
Cars()
{
cout << "Please insert manufacturer name on the car : " << endl;
getline(cin, m_manufacturerName);
cout << "Please insert model of your car : " << endl;
getline(cin, modelName);
cout << "Please insert registrationNumber : " << endl;
getline(cin, registrationNumber);
cout << "Please insert horse power : " << endl;
cin >> horsePower;
cout << "Enter new owner : " << endl;
};
// getters and setters
string getManufactererName()
{
return m_manufacturerName;
}
string getModelName()
{
return modelName;
}
Cars setOwner(Cars &object, Person &owner) // така подавам поинтъра към обекта от тип Person
{
object.m_owner = &owner;
}
Cars getOwner(Cars &object ,Person &owner) // eто тук ми е проблема като
{
return object.m_owner; // компилационната грешка ми е : 'return': cannot convert from Person * to Cars
}
uint16_t getHorsePower()
{
return horsePower;
}
string getRegNumber()
{
return registrationNumber;
}
private:
string m_manufacturerName;
string modelName;
uint16_t horsePower;
string registrationNumber;
};
int Person::s_idGenerator = 0;
int main()
{
Person Slavcho(18,"Slavcho");
Cars Mercedes;
Person John(22, "John");
Mercedes.setOwner(Mercedes, Slavcho);
cout << John.getId() << endl;
}
Колегата y.ivanov вярно ти е отговорил, но като цяло Cars класът ти не изглежда много както трябва:
- Защо наследяваш Person? Първо не е нужно, второ е МНОГО МНОГО МНОГО грешно - наследяване се прави, когато нещо е под-вид на нещо друго. Примерно Cat : Animal, Truck : Vehicle и т.н. Колите по никакъв начин не са вид хора. Наследяването ще го говорим в лекцията в понеделник, така че е нормално да не го знаеш, но определено не трябва да го правиш в тази задача
- Защо setter методите ти приемат Cars обект? Един setter би следвало да set-ва на this, не на някой друг обект, който му подадеш. Това е цялата идея на ООП, в случая: Car someCar; someCar.setOwner(somePerson); Нали затова методът е част от Cars класа, не е глобална функция. Прегледай как го правим в лекцията по ООП за Person обекта
- getter-а, който не ти се компилира, защо приема Person? Нали трябва да върне owner полето, тоест owner полето му е return стойността, няма смисъл да му подаваш и някакъв owner който може да няма нищо общо с текущия обект (и също както setter-а няма нужда да му подаваш обект от тип Cars, нали то трябва да върне на текущия обект нещо, не на някакъв произволен обект нещо)
- Cars конструктора не е много добре да се занимава с вход-изход от конзолата. Един конструктор трябва да инициализира обект с някакви данни. Тези данни трябва да му дойдат като параметри. Въвеждането на тези данни не е в компетенциите на една кола. Тоест, една кола и една конзола на компютър нямат нищо общо, затова в случая не трябва да са в класа за кола.
- Cars представлява 1 кола, значи трябва да е Car. Ако Cars в себе си съдържаше масив от коли, тогава може да е Cars
Прегледай нещата от лекцията за ООП пак. Виж демата с Person, виж как правихме там getter-и и setter-и, виж и как писахме SmartArray класа. Като гледам стила на кода ти (m_owner примерно, както и това, че знаеш за наследяване) предполагам, че преди си учил някакво ООП някъде и са те научили на някакви много грешни неща (или сам си се научил). Забрави ги тези неща за момент и виж какво обяснявахме и какво правихме в 04. OOP Basics with Cpp, прегледай подробно демата, опитай да направиш нещата от тези дема сам и тогава се върни на тази задача - Person и Car не се различават по много, освен по полетата, които ще имат.
Поздрави,
Жоро
Благодаря и на двамата за корекциите и съветите ще поправя нещата и ще направя корекциите .
Поздрави ,
Славчо
Мисля че пооправих нещата прикачвам кода с корекциите ако е удобно да го погледнете и дали вече така е по-добре . При мен се компилира и работи :)
class Person
{
public:
Person(){}
Person(uint8_t age, string name) :m_age(age), m_name(name)
{
m_idGener = s_idGenerator++;
}
int getId()
{
return m_idGener;
}
uint8_t getAge()
{
return m_age;
}
string getName()
{
return m_name;
}
private:
string m_name;
uint8_t m_age;
static int s_idGenerator;
int m_idGener;
};
class Cars
{
public:
Cars()
{
};
Cars(string manufacturerName, string modelName, uint16_t horsePower, string registrationNumber, Person &owner) :
m_manufacturerName(manufacturerName), m_modelName(modelName), m_horsePower(horsePower),
m_registrationNumber(registrationNumber), m_owner(&owner)
{}
// getters and setters
void setOwner(Person &owner)
{
m_owner = &owner;
}
Person *getOwner()
{
return (m_owner);
}
string getModelName()
{
return m_modelName;
}
uint16_t getHorsePower()
{
return m_horsePower;
}
string getRegNumber()
{
return m_registrationNumber;
}
string getManufactererName()
{
return m_manufacturerName;
}
private:
string m_manufacturerName;
string m_modelName;
uint16_t m_horsePower;
string m_registrationNumber;
Person *m_owner;
};
int Person::s_idGenerator = 0;
int main()
{
Person Slavcho(18,"Slavcho");
Cars Mercedes;
Person John(22, "John");
Mercedes.setOwner(Slavcho);
cout << John.getId() << endl;
cout << Mercedes.getOwner()->getName() << endl;
}