2011-11-28 19 views
9

Sınıf kapsamına bir yazım hatası bildirmek kötü bir uygulama mıdır? Kimsenin bu dosyayı içermediğinden emin olmak ve daha sonra aynı ada sahip bir şey yaratmak için her bir işlev için onları bildirmek daha mı iyidir? ÖrneğinSınıf kapsamı hatalı uygulama?

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

orada bu tür kullanan birçok fonksiyonlar vardır, ama diğer taraftan ben başlığında koymak zorunda kalacak bazı sınıflarda olarak benim başlıkların bazılarında faydalı olur, gitmeyeceklerini Ben mi? Ya da kaynak dosyanın en üstüne koyabilir miyim?

+0

Sanırım neden soruyorsun anlamıyorum. Bir şey duydun mu? –

+0

haha, ne? Bu bir şarkıdan mı? – SirYakalot

+0

Örneğinizde yazım hatası yok ... – interjay

cevap

13

Yalnızca kapsamı minimumda tutmalıyım; Bununla, temiz olan her şeyi yapın.

Tek bir işlev için kullanırsanız, bu işlevin kapsamında tutun. Birkaç işlev için kullanırsanız, özel bir yazım yapın. Ve eğer başkalarının bunu kullanmasını beklerseniz (yardımcı programın dışında), bunu herkese açık hale getirin. kodunda

:

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

Umarım bu size ne demek istediğimi bir fikir verir.

+0

, uygulama dosyasının içeriklerini içerme yönergeleri altında koymak bile yasal mıdır? Özel bir üye iyi bir çözüm, sadece olasılıkları merak ediyorum. – SirYakalot

+1

@SirYakalot: Evet, bu sadece dosya kapsamı (global). Ücretsiz işlevler için özel bir yazım hatası öykünmek istiyorsanız, istemciler tarafından erişilememesi gereken bir "ayrıntı" ad alanının olması yaygındır. – GManNickG

+0

Ne dersiniz daha iyi bir uygulama mı? Özel bir üye mi yoksa kaynağın en üstüne mi koyuyor? – SirYakalot

11

Sınıf kapsamı yazım kuralları mükemmel derecede iyidir ve sınıf kapsamı dışında bir şeyle çakışamazlar.

standart kütüphane sınıfı kapsamı typedefs (value_type, pointer, reference, iterator, const_iterator vs gibi) ile ekip.