【问题标题】:Impossible to inherit from this object?不可能从这个对象继承?
【发布时间】:2009-10-16 18:27:33
【问题描述】:

跟进this question,人们建议我选择“选项 3”,可能看起来像这样:

class b2Body {
private:
    b2Body() {}
    friend class b2World;
};

class Body : public b2Body {
private:
    Body() {}
    friend class World;
};

class b2World {
public:
    b2Body *CreateBody() {
        return new b2Body;
    }
};

class World : public b2World {
public:
    Body *CreateBody() {
        return new Body;
    }
};

int main() {
    World w;
    Body *b = w.CreateBody();
    return 0;
}

Try it online

但是这样做有两个主要问题:

  1. Body 永远无法构造,即使使用 World::CreateBody(因为 b2Body 是私有的)
  2. 即使可以,b2Body 部分也不会被正确初始化(b2World::CreateBody 需要被调用)

这是否意味着我永远无法继承 b2Body/b2World 并遵循相同的设计模式? (请记住,我无法编辑 b2* 类)

如果是这样,我想你们会建议我只保留b2Worldb2Body 作为成员变量吗?


我认为现在归结为这两个选项:

【问题讨论】:

    标签: c++ inheritance box2d private-constructor


    【解决方案1】:

    只有b2World 可以创建b2Body,所以这不会去任何地方。这些类显然不是为了继承而设计的,所以是的,而是聚合它们。类似的东西呢

    class Body {
    public:
        Body( b2Body* b ) : b2b( b ) {}
    
    private:
        b2Body*const b2b;
    };
    
    class World {
    public:
        World() : b2w( /* create b2w here */ ) {}
    
        Body *CreateBody() {
                return new Body( b2w->CreateBody( /*...*/ ); }
        }
    private:
        b2World*const b2w;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-11
      • 1970-01-01
      相关资源
      最近更新 更多