2009-10-16 9 views
0

suite à this question, les gens ont suggéré d'aller avec "option 3" qui pourrait ressembler à ceci:Impossible d'hériter de cet objet?

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

Mais il y a deux problèmes majeurs avec ce:

  1. Body ne peut jamais être construit, même avec World::CreateBody (car b2Body est privé)
  2. Même si elle pouvait, alors la b2Body partie ne serait pas initialisé correctement (b2World::CreateBodybesoins à appeler)

Est-ce que cela signifie que je ne peut jamais hériter de b2Body/b2World et suivre ce même modèle de conception? (Gardez à l'esprit que je ne peux pas modifier les classes b2 *)

Si oui, je suppose que vous recommanderiez que je garde simplement b2World et b2Body comme variables membres à la place?


Je pense qu'il se résume à ces deux options maintenant:

Répondre

2

Seulement b2World peut créer un b2Body si cela ne suffit d'aller nulle part. Ces classes ne sont évidemment pas conçues pour être héritées de si oui, les agréger à la place. Qu'en est-il de quelque chose du genre

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

Nice! Alors 'Body' n'a pas besoin d'ami' World'. http://codepad.org/CXufhOiY – mpen

Questions connexes