2010-07-09 11 views
1

Ce sont des fonctions et des déclarations Struct que j'ai, et je ne suis pas autorisé à les modifier.Comment ajouter de nouveaux membres à Struct

DerivedA giveDerivedA(); 
DerivedB giveDerivedB(); 

struct Base{ 
    QString elementId; 
    QString elementType; 
}; 

struct DerivedA : Base { 
    int a; 
    int b; 
}; 

struct DerivedB : Base { 
    int c; 
    int d; 
}; 

Mais ce que j'ai besoin est quelque chose comme ceci:

struct DerivedA : Base { 
    int a; 
    int b; 
    void create(); 
    QString doc; 
}; 

Comment puis-je ajouter ces méthodes et membre à structs je suis arrivé?

Ma première idée est la suivante:

struct myA: DerivedA { 
    void create(); 
    QString doc; 
}; 

Vous avez une suggestion que vous?

Edit: 2 Alternative (Choosen)

struct myA{ 
    void create(); 
    QString doc; 
    private: 
     DerivedA derivedA; 
}; 
+0

Pourquoi doivent-ils être privés? Cela signifie que rien d'autre ne peut y accéder. –

+0

Et pourquoi ne pouvez-vous pas les changer? – GManNickG

+0

@Marcelo Cantos, désolé pas privé, mon mauvais, j'ai édité. – metdos

Répondre

2

Ceci est similaire au problème que les personnes ont à étendre les classes de bibliothèque standard. Si votre classe de base n'a pas de destructeur virtuel, vous ne pouvez pas en hériter en toute sécurité. Dans ce cas, vous devez soit utiliser des fonctions libres (de toute façon préférées), soit de la composition.

Sinon, ce que vous avez là est bon.

+0

La classe de base n'a pas de constructeur virtuel, quel est le problème avec l'héritage dans un tel cas? – metdos

+2

@metdos: Si vous avez: 'struct base {}; structure dérivée: base {}; 'Then:' base * x = new derived; 'devient un comportement indéfini avec' delete x; '. Si vous supprimez un type dérivé via un pointeur de base, le type de base doit avoir un destructeur virtuel. C'est pourquoi vous ne pouvez pas hériter de (la plupart) des classes de bibliothèques standard. – GManNickG

+0

Merci, je vois maintenant. – metdos

0

Ce n'est pas Workin', qui est la façon dont vous le faites.

1

Utilisez la composition ou l'héritage, selon le type de relation que les classes ont (voir par exemple les éléments 32 et 38 dans C++ effectif).

+0

Merci, j'ai aimé "is-implement-in-terms-of". – metdos

Questions connexes