Anasayfa Eğitseller Programlama C++'da İsimuzayları(Namespaces)

C++'da İsimuzayları(Namespaces) PDF Yazdır e-Posta
Kullanıcı Değerlendirmesi: / 5
ZayıfEn iyi 
Eğitseller - Programlama
Pazar, 21 Ocak 2007 03:03

İSİMUZAYI (NAMESPACE)

İsim uzayı denilince aklınıza hemen sonsuz bir boşlukta 3 boyutlu isimler gelebilir. Benim öyle geliyor :)

Her neyse, şimdi ki dersimiz Namespace yani isim uzayı. Aslında yakından biliyorsunuz. Çoğunlukla C++’da çıktı için (ya da girdi için) kullandığınız “iostream” kütüphanesinden elde ediyorsunuz.

Şu kodu C++ ile az da olsa haşır-neşir olan herkes bilir:



#include <iostream>
using namespace std;



İngilizce biliyorsanız eğer, bunun anlamının “kullanılıyor(using) isimuzayı(namespace) std(isimuzayının adı)” olduğunu anlayacaksınız.

Eğer bir hatırlatmada bulunmak gerekirse, ben bu dersleri kadar basit yazmak zorundayım, çünkü inanın bana bu işi bilenlere saçma gibi gelse de, bu işe yeni girişenler için anlamak sizin sandığınız kadar kolay olmayacaktır. Kimseyi ne küçümsüyorum ne de bilgisiz ilan ediyorum. Yalnızca insanların kavrayışını kolaylaştırmayı amaçlıyorum. Ayrıca C++’da her seviyeden insana hitap etmeyi amaçlıyorum.

Neyse, konuya dönmek gerekirse, eğer bir örnek daha isterseniz, isimuzayları “Irrlicht oyun motoru”nun temel yapısını oluşturmaktadır. Eğer kurcalayanlar ya da kullananlar olduysa onlar ne demek istediğimi anlayacaklardır.

Hatırlarsanız (ki ben öyle hatırlıyorum), “core (yani çekirdek)” adında bir isim uzayı mevcuttu. Bu isimuzayını kullanmak için,



using namespace core;



şeklinde bir kod kullanıyordunuz.

Daha sonra “core” un içerdiği sınıfları, veri yapılarını ve fonksiyonları dilediğiniz gibi kullanıyordunuz. Kullanıyorsunuzdur da…

Şimdi isimuzayları nelerdir, nasıl tanımlanır, nasıl kullanılır gibi soruların cevaplarını verelim. Kod dünyasına sıkı bir dalış yapalım.

İlk olarak isimuzayı nasıl tanımlanırı ele alalım;



namespace isimuzayim
{

//kod bloğu

}



şeklinde tanımlanır. Esasen fonksiyonlara ya da sınıflara çok benzer. Ama çok kullanışlı özellikleri mevcuttur. Sırasıyla hepsini göreceğiz.


Şimdi basit bir isimuzayı tanımlayalım ve bunun içine adımızı ve soyadımızı yazan bir fonksiyon yerleştirelim. Sonra da bunu program içersinde tanımlayıp kullanalım.



#include <iostream>

using namespace std; // bu include ettiğimiz iostream içinde var olan isimuzayı

namespace isimuzayim
{
    void adsoyad(char *ad, char *soyad)
    {
        cout << “Adiniz: “ << ad << endl; // endl: satır sonu
        cout << “Soyadiniz: “ << soyad << endl;
    }
}    

void main()
{
    isimuzayim::adsoyad(“Evren”,”Acigul”);
    system(“pause”); // program hemen kapanmasın diye pause komutu verdik
}



Şimdi göreceğiniz üzere isimuzayımız içersinde tanımladığımız fonksiyonumuzu :: (scope, çözünürlük) operatörü ile gösterdik. Bunu kullanmayabiliriz ki bu en doğal hakkımız.

Takdir edersiniz ki, eğer “std” isimuzayını kullanmak için “using namespace” komutlarını kullanmamış olsaydık “cout” u da “std::cout” şeklinde kullanmak durumunda kalacaktık.

Öyle ise bu durumdan kurtulmanın çözümünü hemen belirtelim.



#include <iostream>

using namespace std;

namespace isimuzayim
{
    void adsoyad(char *ad, char *soyad)
    {
        cout << “Adiniz: “ << ad << endl;
        cout << “Soyadiniz: “ << soyad << endl;
    }
}

using namespace isimuzayim;    

void main()
{
    adsoyad(“Evren”,”Acigul”);
    system(“pause”);
}



Bu şekilde, isimuzayımızdaki fonksiyonumuzu sanki isimuzayı içersinde tanımlanmamışçasına kullanabiliriz.

İsimuzaylarının diğer bir özelliği ise, birden fazla kod bloğu bulunan fakat değişik veri yapıları, fonksiyonlar, değişkenler içeren ama aynı isimuzayı adını taşıma olabilirliğidir.

Bunu anlatmak için birinde adımız diğerinde soyadımızın bulunduğu aynı isimde iki isimuzayı tanımlayalım.



#include <iostream>
using namespace std;

namespace isimuzayim
{
    char* ad = "Evren";
}

namespace isimuzayim
{
    char* soyad = "Acigul";
}

using namespace isimuzayim;

void main()
{
cout << "Adiniz: " << ad << endl;
cout << "Soyadiniz: " << soyad << endl;

ad = "Ad";
soyad = "Soyad";

cout << "Adiniz: " << ad << endl;
cout << "Soyadiniz: " << soyad << endl;

system("pause");
}


Gördüğünüz gibi, sanki iki global değişken tanımlamışçasına bu değişkenlere hem değer atadık, hem de barındırdıkları değerin çıktısını alabildik.

Eğer “using namespace isimuzayim” şeklinde bir tanımlama kullanmazsak, değişkenleri şu şekilde kullanabilirdik,



#include <iostream>
using namespace std;

namespace isimuzayim
{
    char* ad = "Evren";
}

namespace isimuzayim
{
    char* soyad = "Acigul";
}

void main()
{
cout << "Adiniz: " << isimuzayim::ad << endl;
cout << "Soyadiniz: " << isimuzayim::soyad << endl;

isimuzayim::ad = "Ad";
isimuzayim::soyad = "Soyad";

cout << "Adiniz: " << isimuzayim::ad << endl;
cout << "Soyadiniz: " << isimuzayim::soyad << endl;

system("pause");
}



Dilediğiniz gibi tanımlamalar kullanabilir, dilediğiniz gibi örnekleri genişletip çoğaltabilirsiniz. İsimuzayları hayal gücünüze göre kullanılmayı bekliyor.

Forum da istediğinizi, anlayamadığınızı sorabilirsiniz. Hepinize kolay gelsin. Başarılar dilerim…

(Not: Tüm kodlar denenmiş ve çalışır haldedir…)

 

Yazar: Evren ACIGÜL

Son Güncelleme ( Pazar, 21 Ocak 2007 03:06 )
  Yorum yok.
Yorum ekle. (0 yorum)

 

OyunGelistirici.net - Türk Oyun Yapımcılarının Buluşma Noktası

Bu sitede yazılan tüm yazıların hakları yazarlarına aittir. İzin alınmadan yayınlanamaz.

Bu sitede Firefox kullanmanız önerilir. En az 1024 x 768 masaüstü çözünürlüğü tavsiye edilir.