Loading...
slavi91 avatar slavi91 7 Точки

С++ 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;
    

    
}

Тагове:
0
C++ Programming
y.ivanov avatar y.ivanov 33 Точки

Привет,

Мисля, че проблема е заради идентификатора пред метода. Той трябва да е от същия тип, като връщания резултат. Пробвай това:

Person* getOwner(Cars &object ,Person &owner) // eто тук ми е проблема като
    {
        return object.m_owner; // компилационната грешка ми е : 'return': cannot convert from Person * to Cars
    }

Поздрави

Ясен

0
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Колегата 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 не се различават по много, освен по полетата, които ще имат.

Поздрави,

Жоро

1
slavi91 avatar slavi91 7 Точки

Благодаря и на двамата за корекциите и съветите  ще поправя нещата и ще направя корекциите .

Поздрави , 

Славчо 

0
slavi91 avatar slavi91 7 Точки

Мисля че пооправих нещата прикачвам кода с корекциите ако е удобно да го погледнете и дали вече така е по-добре . При мен се компилира и работи :) 

 

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;

    
}

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.