Софтуерно Инженерство
Loading...
+ Нов въпрос
slavi91 avatar slavi91 0 Точки

С++ 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 546 Точки

Колегата 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 0 Точки

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

Поздрави , 

Славчо 

0
slavi91 avatar slavi91 0 Точки

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

 

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