Проблемы с декларации переменных

130
31 декабря 2020, 02:50

Проблема заключается в то, что этот участок кода работает нормально, но из-за него проблемы.

if (mode == 1)
{
    Animal main_object;
}
else if (mode == 2)
{
    Human main_object;
}
else
{
    Cat main_object;
}
std::string name_object;
std::cin >> name_object;
main_object.set_name(name_object);

т.е. когда я обращаюсь к main_object я получаю это :

main.cpp:185:2: ошибка: нет декларации «main_object» в этой области видимости
main_object.get_object()->set_name(name_object);

как это обойти это или какие костыли использовать?

p.s. h фаил классов

#ifndef ANIMAL_H
#define ANIMAL_H
#include <string>
class Animal
{
  public:
          Animal();
          Animal(std::string name_arg, int year_arg);
          ~Animal();
  protected: std::string name;
  public:
          std::string get_name();
          void set_name(std::string name_arg);
  protected: int year;
  public:
          virtual int get_year();
          virtual void set_year(int year_arg);
          virtual void show();
          virtual void say_something();
};

class Human : public Animal
{
  public:
          Human();
          Human(std::string name_arg, int year_arg);
          Human(const Human& object);
          ~Human();
          int get_year();
          void set_year(int year_arg);
          void show();
          void say_something();
};

class Cat : public Animal
{
  public:
          Cat();
          Cat(std::string name_arg, int year_arg);
          Cat(const Cat& object);
          ~Cat();
          int get_year();
          void set_year(int year_arg);
          void show();
          void say_something();
};
#endif
Answer 1

Если мы имеем дело с иерархией, то можем легко обеспечить полиморфизм времени выполнения:

 class Animal {
    //...
    public:
    virtual void set_name(const std::string& s){ ...}
}; 
//...

Тогда легко сделать то, что вы задумали:

//...
Animal a; Human h; Cat c;
Animal* p;   
if (mode == 1)
{
    p = &a;
}
else if (mode == 2)
{
   p = &h;
}
else
{
     p = &c;
}
Animal& main_object = *p;
std::string name_object;
std::cin >> name_object;
main_object.set_name(name_object);
READ ALSO
Рекурсивный проход по элементам XML

Рекурсивный проход по элементам XML

Я выбрал tinyxml2 для парсинга XML файлов, хочу узнать как рекурсивно обойти элементы XML

86
Сборка проекта из под Windows в Linux

Сборка проекта из под Windows в Linux

Очень нужно собрать проект (библиотеки и исполняемые файлы) на Qt в виндовсе на линуксНашел в интернете про сборку с линукса на виндовс, но ничего...

96
С++: приведение типов

С++: приведение типов

Подскажите пожалуйста один вопросик (что-то совсем из головы вылетело):

116