Как напечатать некоторые определенные c атрибуты производного класса, используя перегрузку < - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть базовый класс с именем Animals и 2 производных класса Dog and Cat

class Animal{

protected:
    std::string name;
    std::string color;
public:
    std::string getName() {
        return name;
    }

    std::string getColor() {
        return color;
    }
...
class Cat : public Animal {
private :
    int lives;
public :
    int getLives() {
        return lives;
    }
...
class Dog : public Animal {
private :
    std::string gender;

public:
    std::string getGender(){
        return gender;
    }
...

, и у меня есть c из shared_ptr

std::vector<std::shared_ptr<Animal>> animals

Я добавил несколько кошек и собак в вектор, и я пытаюсь распечатать все характеристики каждого животного из вектора, используя оператор >> (это домашнее задание, мы должны использовать это), и я сделал это

template <typename T>
std::ostream& operator<<(std::ostream& os, const std::vector<std::shared_ptr<T>>& v)
{

    for (int i = 0; i < v.size(); ++i) {
        os << v[i]->getName();
        os << "-";
        os << v[i]->getColor();
        if (i != v.size() - 1)
            os << ", ";
            os<<"\n";
    }

    return os;
}

но таким образом я могу напечатать только имя и цвет или животных (эти атрибуты находятся в базовом классе). Мой вопрос: Как я могу напечатать все атрибуты, для жизни кошек и для пола собаки? ??

1 Ответ

0 голосов
/ 25 апреля 2020

Попробуйте это:

class Animal {

protected:
    std::string name;
    std::string color;
public:

    virtual void print(std::ostream& os){
        os << "Name:" << name <<" Color:"<< color;
    }

    void setName(string n) { name = n; }
    void setColor(string c) { color = c; }
    std::string getName() {
        return name;
    }

    std::string getColor() {
        return color;
    }
};
class Cat : public Animal {
private:
    int lives;
public:
    void setLives(int n) { lives = n; }
    void print(std::ostream& os) {
        Animal::print(os);
        os <<" Lives:"<<lives;
    }
    int getLives() {
        return lives;
    }
};
class Dog : public Animal {
private:
    std::string gender;  
public:
    void setGender(string g) { gender = g; }
    void print(std::ostream& os) {
        Animal::print(os);
        os << " Gender:" << gender;
    }
    std::string getGender() {
        return gender;
    }
};  
template <typename T>
std::ostream& operator<<(std::ostream& os, const std::vector<std::shared_ptr<T>>& v)
{
    for (int i = 0; i < v.size(); ++i) {
        v[i]->print(os);
        os << "\n";
    }   
    return os;
}    
int main()
{
    shared_ptr<Dog> d1 = make_shared<Dog>();
    d1->setName("Dog1"); d1->setColor("White"); d1->setGender("Male");
    shared_ptr<Cat> c1 = make_shared<Cat>();
    c1->setName("Cat1"); c1->setColor("Brown"); c1->setLives(1);
    vector<shared_ptr<Animal>> vec;
    vec.push_back(d1);
    vec.push_back(c1); 
    cout << vec;   
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...