2013-07-16 11 views
7

C++ 'da, başka bir ad alanından bir işlev çağırmak zorunda kalırsam, foo, iki seçeneğim var: using namespace foo; koduma ekleniyor veya arama gerçekleştirdiğimde ad alanını belirliyor foo::myFunction()."kullananlar" olmadan başka bir birimden bir yordam çağırın

Delphi'de ikinci alternatife karşılık gelen bir yapı var mı?

+0

C++ senaryolarınızın başlıkla ilgili bir şeyleri göremiyorum. Delphi'deki birimleri kullanarak nasıl bir ilişki vardır? Aynı temel kelimeyi kullanırlar * kullanımı *, ama bu konuyla ilgili. –

+2

@RobKennedy: Pascal'ın birimleri sadece bir kod dosyasının ad alanları gibi davranır. Yani, senaryolar bir C++ POV'den geçerli bir metafordur. –

cevap

10

Hayır, yok. (myFunction gibi böyle bir fonksiyonu olarak) bir tanımlayıcı ünitesinde foo ilan edilirse, o zaman farklı bir birim bar yılında, diyelim ki, sen implemantation veya interface bölümünde ya uses maddeye foo eklemeden myFunction kullanamaz.

Bazı tartışma

Diyelim ki iki işlevi MyFunc, foo içinde bir ve bar bir var diyelim. Diyelim ki foo'dasınız. add çubuğunu uses listelerinden birine yapmazsanız, MyFuncfoo.MyFunc'a başvurur ve diğer işleve erişemezsiniz. bar listelerini uses listelerinden birine eklerseniz, MyFuncfoo.MyFunc yerel işlevine yine de başvuracak, ancak bar.MyFunc yazarak diğerine erişebilirsiniz. Karışıklık riskini azaltmak için, her zaman açık olmak ve foo.MyFunc ve bar.MyFunc, ve sadece MyFunc yazabilirsiniz.

yaygın bir senaryo şudur: Eğer (onlar çok farklı olabilir) foo ve bar hem de bir tanımlayıcı ident var ve MyUnit yılında, bazı uses listede hem foo ve bar var. Sonra, MyUnit, ident, kullanım maddelerinde sonun hangi birime bağlı olduğuna bağlı olarak foo.ident veya bar.ident, 'a başvuracaktır. Diğerini kullanmak için, birim hakkında açık olmalısınız (foo.ident veya bar.ident gibi). Tabii ki, hata yapma riskini azaltmak için, her zaman açık olabilirsiniz (örneğin foo son verse bile foo.ident yazınız, böylece ident aynı zamanda foo.ident).

Sık karşılaşılan bir hata, Windows.TBitmap'u Graphics.TBitmap ile karıştırmaktır. Normal olarak, TBitmap, Graphics.TBitmap (Windows birimi genellikle uses maddelerinde erken gelir) anlamına gelir. Bu karışıklık SO'da tedavi edildi.

+0

Ok teşekkürler, bu yüzden hem ünite foo hem de birim çubuğunda aynı isimde bir prosedürüm varsa, ben hapsoldum mu? –

+0

Ahem, topictarter'ın "ilk" ve "ikinci" alternatifini yanlış sırada görüyorsunuz –

İlgili konular