Конструктор объекта внутри другого конструктора? - PullRequest
0 голосов
/ 20 апреля 2020

Я все еще свободен sh до CPP, и я пробую новые вещи со всем этим свободным временем, которое у нас есть в настоящее время. У меня есть 2 отдельных класса, и я хочу создать список инициализаторов для обоих в основном ... Может быть, я не говорю об этом в лучших словах, но ...

Вот это:

class Status
{
public:
    int x, y;
    float angle;
    unsigned short hp;
    bool isActive;
    Status(const int _x, const int _y, const float _angle, const unsigned short _hp, bool _isActive)
        : x(_x), y(_y), angle(_angle), hp(_hp), isActive(_isActive){};
};

И это:

class Hero
{
    std::string name;
    Status status;
    Hero(const std::string _name, Status &status)
        : name(_name), status(x, y, angle, hp, isActive){}; 
    void display()
    {
        std::cout << "Hero:\t" << name << std::endl;
        std::cout << "HP:\t" << Hero::status.hp << std::endl;
        std::cout << "Hero is " << Hero::status.isActive ? " active" : " inactive";
        std::cout << std::endl;
    };

... и я в конечном итоге хочу сделать что-то подобное ... Hero h = {"Iron Man", {1, 2, 32.9, 100, true}};

Пожалуйста, ведите меня, о мудрые. ..

Ответы [ 2 ]

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

Этот код:

Hero(const std::string _name, Status &status)
    : name(_name), status(x, y, angle, hp, isActive){}; 

должен быть:

Hero(const std::string _name, Status status)
    : name(_name), status(status){};

При желании это может быть status(std::move(status)).

Также существует ошибка логика c в строке с условным оператором, который имеет более высокий приоритет, чем <<, поэтому вам нужно несколько скобок.

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

Две проблемы:

  1. Сначала вы не можете напрямую использовать Status переменные-члены. Чтобы решить эту проблему, вам либо нужно получить к ним обычный доступ, как в

    Hero(const std::string _name, Status &_status)
        : name(_name), status(_status.x, _status.y, _status.angle, _status.hp, _status.isActive)
    {}
    

    , либо вы можете просто положиться на автоматически сгенерированный конструктор копирования:

    Hero(const std::string _name, Status &_status)
        : name(_name), status(_status)
    {}
    
  2. Вторая проблема состоит в том, что выражение {1, 2, 32.9, 100, true} приводит к так называемому rvalue , который не может быть захвачен обычными ссылками. Вам нужно либо использовать rvalue-ссылки, const ссылки, либо простые не ссылочные значения. Я действительно рекомендую последнее:

    Hero(const std::string _name, Status _status)
        : name(_name), status(_status)
    {}
    
...