2009-08-02 37 views
7

Bir başlık dosyasının geçerli ad alanına bir tanımlayıcıyı kaldırdığı aşağıdaki minimalist örnek üzerinde kendi kod doğruluğumu sorgulamaya çalışıyorum.Ad alanı doğruluğu

#include <string> 

namespace mine { 

    using std::string; // std::string lifted into mine 

    struct agent 
    { 
     string name; 
    }; 
} 

Bu benim bir typedef kullanımına başka alternatif olarak son zamanlarda yapılan bir öneridir:

#include <string> 

struct agent 
{ 
    private: 
     typedef std::string string; 
    public: 
     string name; 
}; 

bu benim kendi ad kullanımı yapar çünkü daha doğru ilk seçeneği olarak kabul edilir ve bu bir olduğunu Birinin alışması gereken uygulama (isim-alanı yaratma ve yönetim). Bu arada, tanımlayıcı kontrol ettiğim bir isim alanının içinde kaldırıldığından, bunu güvenli bir yaklaşım haline getirir. Bununla birlikte, ikinci düşünceleri yaşıyorum. Örneğin, bir yönerge kullanılarak mayın numaralı alanın dikkatsiz kullanımı, std :: string'i de görünümüne getirecektir. Başka bir sorun da std :: string'i çok fazla göstermem. Belki de gerekli veya arzu edilmeyen ad alanı alanlarına bile.

Her zaman mümkün olan en düşük kapsamda çalışmak ve oradan çalışmak için daha doğru görünüyor. Sadece kesinlikle gerekli olanı ortaya çıkarın. İkinci örnekte typedef özel yapmak aslında tam olarak bunun nedeni. Ama sonra kendi tavsiyemi ikinci örnekle takip etmiyorum.

Ama öte yandan

, benim endişeleri ad mayın kötüye olabilir aslında birinden sonuç:

using namespace mine; 

İlk bakışta, bu bir ad alanı için doğru bir kullanım modeli değil biliyorum. Ancak, arzu edilebilir olduğunda örneklerin reddedilemez. İlk yaklaşımın ne kadar geçerli olduğunu düşünüyorsunuz?

namespace mine { 
    struct agent 
    { 
     std::string name; 
    }; 
} 

Ben şahsen hiç başlık dosyalarında direktifleri kullanarak kullanmayın:

cevap

8

ben bariz bir çözümdür sanırdım. Uygulama dosyalarında kesinlikle.

+0

Kesinlikle! Her halükarda, örnek, yazarın bir sınıf içinde beyan edilmek için çok fazla türü olduğu ve yazımlarını basitleştirmek istediği durumlara hizmet eder. İlk örnekle yanlış tavsiyede bulundum hissettim. Ama std :: string oldukça innocuos olduğundan bazı düşünceler ister. –

+1

Sanırım gerçekten sorduğun şeyi netleştiremiyorum. Fakat C++ ad alanlarındaki tasarım araçlarının bir tasarım aracı olmadığını, dolayısıyla çok fazla ad alanı sorunu yaşıyorsanız, muhtemelen çok fazla ad alanınız olduğunu gözlemlerdim. –

7

Normalde bunu:

// In header file: 

#include <string> 

namespace mine { 

    struct agent 
    { 
     std::string name; 
    }; 
} 

// In source file: 

using std::string; 

namespace mine { 
    // Code 
}  

Eğer uygulanmasında defalarca :: std yazmak gerekmez Bu şekilde, ancak yanlışlıkla ithal üstbilgilerinizi kullanan insanların sorunu önlemek std :: semboller.

+0

"Benim" şablonları tanımlarsa, başlık dosyası kaynak dosyada olur. –

1

Bunu genelde:

// In header file 
#include <string> 
namespace mine 
{ 
    namespace detail 
    { 
     using std::string; 

     struct agent 
     { 
      string name; 
     } 
    } 

    using detail::agent; 
} 

Ben de başlığındaki std:: yazarak tutmak gerekmez Bu şekilde, ama biri hala using namespace mine; yapmak ve std adları alamıyor.