Ad Alanları

Ad alanı, içinde çeşitli kimliklerin tanımlandığı özel olarak bildirilen bir alandır: değişkenler, fonksiyonlar, sınıflar, vb. namespace anahtar sözcüğü kullanılarak ayarlanır:

namespace name of_space { 
  // fonksiyon, sınıf ve değişken tanımları listesi
}

'namespace' uygulamak, global ad alanını alt alanlara bölmeyi sağlar. Ad alanı içindeki tüm kimlikler ek bilgi belirtilmeden birbirleri için kullanılabilir. :: operatörü (bağlam çözünürlüğü işlemi), ad alanı üyelerine dışarıdan erişmek için kullanılır.

namespace ProjectData
{
class DataManager
  {
public:
   void              LoadData() {}
  };
void Func(DataManagermanager) {}
}
//+------------------------------------------------------------------+
//| Script programı başlatma fonksiyonu                              |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- ProjectData ad alanıyla çalışma
   ProjectData::DataManager mgr;
   mgr.LoadData();
   ProjectData::Func(mgr);
  }

Ad alanları, mantıksal gruplar biçiminde bir kod düzenlemek ve bir programda birkaç kütüphane kullanıldığında ortaya çıkabilecek ad çakışmalarını önlemek için kullanılır. Bu gibi durumlarda, her bir kütüphanenin gerekli fonksiyonlarına ve sınıflarına açıkça erişmek için her bir kütüphane kendi ad alanında bildirilebilir.

Bir ad alanı, bir veya birkaç dosyada birkaç blok halinde bildirilebilir. Derleyici ön işleme sırasında tüm parçaları bir araya getirir ve elde edilen ad alanı tüm parçalarda bildirilen bütün üyeleri içerir. Sample.mqh include (ekle) dosyasında uygulanan bir A sınıfımız olduğunu varsayalım:

//+------------------------------------------------------------------+
//|                                                       Sample.mqh |
//+------------------------------------------------------------------+
class A
  {
public:
                     A() {Print(__FUNCTION__);}
  };

Bu sınıfı projemizde kullanmak istiyoruz ama zaten A sınıfımız var. Her iki sınıfı da kullanabilmek ve kimlik çakışmasından kaçınmak için, eklenen dosyayı bir ad alanına kaydırın:

//--- ilk A sınıfını bildir
class A
  {
public:
                     A() {Print(__FUNCTION__);}
  };
//--- çakışmayı önlemek için A sınıfını Sample.mqh dosyasından Library ad alanına kaydır
namespace Library
{
#include "Sample.mqh"
}
//--- Library ad alanına başka bir sınıf daha ekle
namespace Library
{
class B
  {
public:
                     B() {Print(__FUNCTION__);}
  };
}
//+------------------------------------------------------------------+
//| Script programı başlatma fonksiyonu                              |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- global ad alanından A sınıfını kullan
   A a1;
//--- Library ad alanından A ve B sınıflarını kullan
   Library::A a2;
   Library::B b;
  }
//+------------------------------------------------------------------+
 
/*
Result:
   A::A
   Library::A::A
   Library::B::B
*/

Ad alanları iç içe yerleşebilir. İçi içe yerleşmiş bir ad alanı, üst alan üyelerine sınırsız erişime sahiptir; ancak üst alan üyeleri iç içe yerleşmiş ad alanına sınırsız erişime sahip değildir.

namespace General
{
int Func();
 
namespace Details
{
 int Counter;
 int Refresh()  {return Func(); }
}
 
int GetBars()   {return(iBars(Symbol(), Period()));};
int Size(int i) {return Details::Counter;}
}

 

Global ad alanı

Kimlik, ad alanında açıkça belirtilmezse, global ad alanının örtülü bir parçası olarak kabul edilir. Global kimliği açıkça belirlemek için, bir ad olmadan kapsam çözünürlüğü operatörünü kullanın. Bu durum, bu kimliği farklı bir ad alanında bulunan aynı ada sahip diğer herhangi bir öğeden ayırt etmenizi sağlayacaktır.  Örneğin, bir fonksiyonu içe aktarırken:

#import "lib.dll"
int Func();
#import
//+------------------------------------------------------------------+
//|  Bazı fonksiyonlar                                               |
//+------------------------------------------------------------------+
int Func()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Script programı başlatma fonksiyonu                              |
//+------------------------------------------------------------------+
void OnStart()
  {
//+--- içe aktarılan fonksiyonu çağır
   Print(lib::Func());
//+--- fonksiyonumuzu çağır
   Print(::Func());
  }

Bu durumda, DLL işlevinden içe aktarılan tüm fonksiyonlar aynı adın ad alanına eklenmiştir. Bu, derleyicinin çağrılacak fonksiyonu net bir şekilde belirlemesini sağladı.

Ayrıca bakınız

Global Değişkenler, Yerel Değişkenler, Değişkenlerin kapsamı ve ömrü, Objelerin oluşturulması ve silinmesi