2011-11-28 29 views
9

È una cattiva pratica dichiarare un typedef in ambito di classe? È meglio dichiararli per ogni funzione per assicurarsi che nessuno includa quel file e poi crei qualcosa con lo stesso nome?Cattiva pratica per la classe scope typedef?

Per esempio

typedef std::vector<int>::size_type vec_int; 

sarebbero utili in alcune delle mie intestazioni come in alcune classi ci sono molte funzioni che utilizzano questo tipo, ma d'altra parte avrei dovuto metterlo nella testata, wouldn io? O potrei metterlo in cima al file sorgente?

+0

Immagino di non capire perché lo stiate chiedendo. Hai sentito qualcosa? –

+0

haha, eh? È da una canzone? – SirYakalot

+0

Nel tuo esempio non c'è typedef ... – interjay

risposta

13

Direi che basta limitare al minimo l'ambito; con quello, fai ciò che è più pulito.

Se lo si utilizza per una funzione, tenerlo nell'ambito di questa funzione. Se lo usi per diverse funzioni, rendilo un typedef privato. E se ti aspetti che altri lo usino (forse fuori servizio, forse), rendilo pubblico.

in codice:

namespace detail 
{ 
    // By convention, you aren't suppose to use things from 
    // this namespace, so this is effectively private to me. 

    typedef int* my_private_type; 
} 

void some_func() 
{ 
    // I am allowed to go inside detail: 
    detail::my_private_type x = 0; 

    /* ... */ 
} 

void some_other_func() 
{ 
    // I only need the typedef for this function, 
    // so I put it at this scope: 
    typedef really::long::type<int>::why_so_long short_type; 

    short_type x; 

    /* ... */ 
} 

typedef int integer_type; // intended for public use, not hidden 

integer_type more_func() 
{ 
    return 5; 
} 

class some_class 
{ 
public: 
    // public, intended for client use 
    typedef std::vector<int> int_vector; 

    int_vector get_vec() const; 

private: 
    // private, only for use in this class 
    typedef int* int_ptr; 
}; 

Speriamo che ti dà un'idea di quello che voglio dire.

+0

è legale persino metterlo in cima al file di implementazione sotto le direttive di inclusione? un membro privato è una buona soluzione, sono solo curioso di sapere le possibilità. – SirYakalot

+1

@SirYakalot: Sì, è solo l'ambito del file (globale). Se si desidera emulare un typedef privato per le funzioni libere, è comune avere uno spazio dei nomi 'detail' che non dovrebbe essere accessibile dai client. – GManNickG

+0

cosa diresti è migliore pratica? un membro privato o metterlo in cima alla fonte? – SirYakalot

11

I typedef degli scope di classe sono perfettamente a posto e non possono entrare in conflitto con qualcosa al di fuori dell'ambito della classe.

La libreria standard sta collaborando con typedef ambito di classe (value_type, pointer, reference, iterator, const_iterator ecc ecc).

Problemi correlati