2010-02-01 35 views

risposta

16

Dipende. Se si desidera che A<C> e B siano distinti ma tipi correlati, B deve estendere A<C>. Se vuoi che siano identici, devi usare uno typedef. Puoi fornire altro contesto?

+0

Va ricordato che il typedef non può essere predeterminato. Quindi preferisco l'ereditarietà. – user877329

4

Dipende da ciò che si desidera. Se si utilizzano classi diverse per personalizzare la meta programmazione del modello, è preferibile creare B.

Se si utilizza l'ereditarietà solo per ridurre la digitazione di quanto non sia una soluzione appropriata e si deve andare con typedef, sono stati introdotti per quello.

2

Definitivamente, se l'intento è quello di dare un nuovo nome a un tipo di dati esistente, utilizzare un typedef.

1

Bene, presumo che si stia utilizzando la classe vuota per uscire ripetutamente da digitare A<C>. In tal caso, penso che un typedef sia un'idea migliore. Almeno, sembra essere il modo in cui viene fatto più spesso.

Vorrei aggiungere che questa è solo la mia opinione. Le persone non sono del tutto d'accordo nell'usare typedef in generale. Anche se penso che sia abbastanza bene in questo caso.

Dopo aver letto la risposta di Jon Purdy, vorrei aggiungere che è necessario utilizzare l'ereditarietà se è necessario estendere A e non altrimenti.

1

A causa di ciò che si desidera, l'effetto non è lo stesso.

I typedef di C++ non sono "forti", il che significa in sostanza che B e A<C> saranno dello stesso tipo. Se vuoi essere in grado di distinguere tra i due, usa una classe.

Diverse implementazioni di typedef forte sono reperibili sul Web, ad esempio the boost one.

2

Non è esattamente la stessa cosa. Ad esempio, con typedef si può fare questo:

typedef A<C> B; 
func(B param) {...} 
... 
A<C> var; 
func(var); 
0

Per completezza voglio aggiungere un altro punto: Con

class B : public A<C> { }; 

si può facilmente avanti dichiarare B:

class B; 
void func(B param);