использование static_cast для изменения производного члена структуры - PullRequest
0 голосов
/ 08 октября 2019

Для моего нового проекта я хотел использовать свой предыдущий код в качестве фреймворка для ускорения создания прототипов, избегая переписывания кода. В приведенном ниже коде структура Derived принадлежит новому проекту и требует определения нового члена MoreElaborateMember, в котором есть элементы, относящиеся к новому проекту. Я хочу использовать функцию foo из базового проекта для внесения изменений в MoreElaborateMember, но не могу. Как я могу решить эту проблему, не касаясь базового кода?

#include <cassert>

struct SimpleMember
{
    int a;
};

struct MoreElaborateMember: SimpleMember
{
    // lots of other stuff
};

struct Base
{
    SimpleMember member;
};

struct Derived: Base
{
    MoreElaborateMember member;
};

void foo(Base& base)
{
    base.member.a = -1;
}

int main()
{
    Base base;
    Derived derived;
    foo(static_cast<Base&>(derived));
    assert(derived.member.a == -1);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Вам будет удобнее, если вы используете полиморфизм.

#include <cassert>

struct SimpleMember
{
  int a;
};

struct MoreElaborateMember : SimpleMember
{
  // lots of other stuff
};

struct Base
{
  protected:
  SimpleMember member;

  public:
  virtual void set_member(int m) = 0;
};

struct Derived : public Base
{
  MoreElaborateMember member;

  virtual void set_member(int m)
  {
    Base::member.a = m;
    member.a = m;
  }
};

void foo(Base* base)
{
  base->set_member(-1);
}

int main()
{
  Derived derived;
  foo(&derived);
  assert(derived.member.a == -1);

  return 0;
}
0 голосов
/ 08 октября 2019

Рассматривали ли вы создание MoreElaborateMember из SimpleMember вместо наследования? Может быть, это немного похоже на котельную тарелку, но я думаю, что она бы достигла того, что вы хотите, если я правильно поняла.

struct SimpleMember
{
    int a;
};

struct MoreElaborateMember
{
    MoreElaborateMember(SimpleMember& s)
        : a(s.a)
    {}
    int& a;
    int b;
};

struct Base
{
    SimpleMember member;
};

struct Derived : public Base
{
    Derived()
        : Base()
        , member(Base::member)

    {}
    MoreElaborateMember member;
};

void foo(Base& base)
{
    base.member.a = -1;
}

int main(int, char**)
{
    Derived derived;

    derived.member.a = 13;
    derived.member.b = 42;
    assert(derived.member.a == 13);
    assert(derived.member.b == 42);

    foo(derived);
    assert(derived.member.a == -1);
    assert(derived.member.b == 42);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...