繁体   English   中英

使用 static_cast 更改派生结构成员

[英]using static_cast to change derived struct member

对于我的新项目,我想使用我以前的代码作为框架,通过避免重写代码来加速原型设计。 在下面的代码中, Derived结构属于新项目,它需要定义一个新成员, MoreElaborateMember ,其中包含与新项目相关的内容。 我想使用基础项目中的 function, fooMoreElaborateMember进行更改,但我不能。 如何在不涉及基本代码的情况下解决此问题?

#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;
}

您是否考虑过从 SimpleMember 组合 MoreElaborateMember 而不是继承? 可能有点像样板,但我认为如果我理解正确的话,它会达到你想要的。

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;
}

如果你使用多态,你会更舒服。

#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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM