2012-11-19 1 views
0

Dire que j'ai le code comme ceci:Comment nous une classe de base dans un paramètre de sortie

class B {} 
class D : class B {} 

void MakeD(int params, D** out, int* status_out); 

Aujourd'hui, je l'appelle comme ceci:

B* b; 
if (use_d) { 
    D* d; 
    MakeD(params, &d, &status) 
    b = d; 
} else... 

Y at-il un moyen plus propre d'écrire ce qui évite un objet 'd' distinct, mais sans perdre le type de sécurité existant (ie pas de reinterpret_cast)?

+4

Au lieu d'utiliser un argument « out », pourquoi ne pas retourner simplement le pointeur? –

+0

Je ne vois aucune instanciation d'objet 'D' ici. Vous travaillez avec des pointeurs non définis. Que se passe-t-il dans MakeD? –

+0

Modifier vos tags. C n'a pas de classes. C'est C++ – evanmcdonnal

Répondre

1

Y at-il une raison pour laquelle vous ne pouvez pas simplement modifier votre méthode MakeD() pour retourner un nouveau D au lieu de passer dans un pointeur sur un D?

ie.

D* MakeD(int params, int* status_out); 

... 

b = MakeD(params, &status); 

Ou la méthode MakeD() fait-elle partie de l'API de quelqu'un d'autre?

+0

Dans mon code, le 'out' est rempli de manière asynchrone, donc je ne peux pas changer MakeD pour le retourner de manière synchrone, mais évidemment cette contrainte n'a pas été formulée dans ma question. –

0

Pourquoi ne pas utiliser les fonctionnalités de C++ de base tels que le constructeur de la classe et le polymorphisme: B* b = new D(params);

0

Quelque chose comme

B *b = use_d ? new D(params) : new <something else>; 

devrait fonctionner. Je suppose que le quelque chose d'autre est probablement un objet B (construit en utilisant différents paramètres peut-être?). Il doit être B ou une classe dérivée de B pour que le code fonctionne.

Et, comme toujours, ne pas utiliser une B* brute, utilisez plutôt

std::unique_ptr<B> ptr(use_d ? new D(params) : new <something else>); 
Questions connexes