Как элегантно нарезать объект - PullRequest
0 голосов
/ 27 октября 2018

Итак, в основном у меня есть класс SomethingSwimming и производный класс Ship.Я хочу реализовать, что при каком-то событии Ship может потерять свои особые качества (например, удержание омаров в заложниках) и стать просто еще одним SomethingSwimming объектом.

Для иллюстрации:

class SomethingSwimming
{
    protected:
    int m_treasures;

    public:
    SomethingSwimming(int treasures): m_treasures(treasures) {;}
    virtual int howManyLobstersOnBoard() {return 0; }
};

class Ship: public SomethingSwimming
{
    protected:
    int m_lobstersOnBoard;

 public:
    Ship(int treasures, int lobstersOnBoard): SomethingSwimming(treasures), m_lobstersOnBoard(lobstersOnBoard) {;}
    int howManyLobstersOnBoard() {return m_lobstersOnBoard; }
};

void crash(shared_ptr<SomethingSwimming>& b)
{
    b = make_shared<SomethingSwimming>(100);
}

int main()
{
    shared_ptr<SomethingSwimming> a = make_shared<Ship>(100, 12);

    cout << "How many lobsters on board: " << a->howManyLobstersOnBoard() << endl;

    crash(a);

    cout << "How many lobsters on board: " << a->howManyLobstersOnBoard() << endl;

    return 0;
}

Мой вопрос заключается в том, как crash Ship, чтобы он стал только SomethingSwimming (так что это уже не Ship) без повторной инициализации.

1 Ответ

0 голосов
/ 27 октября 2018

Нельзя обрезать остальную часть объекта, сохраняя идентичность базового субобъекта.Вы можете создать новую копию базового подобъекта и выбросить производный объект.

В настоящее время вы создаете несвязанный объект в crash, и поэтому m_treasures не будет затронут m_treasures изранее указанный объект.Чтобы создать копию исходного базового подобъекта, вы можете сделать:

b = make_shared<SomethingSwimming>(*b);

В качестве альтернативы, на сайте вызова вы можете обрабатывать косвенно ссылающуюся базу, как если бы она не была частью производного объектавызывая виртуальные функции-члены статически:

a->SomethingSwimming::howManyLobstersOnBoard()

Это приведет к значению m_treasures независимо от самого производного типа объекта.

...