Forum: Diğer Konular RSS
C++ İsim Alanları Kullanımı
Using Namespaces in C++
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: C++ İsim Alanları Kullanımı
Merhaba,

Basit kısımlarını sormayacağım ama istemeden basite girebilirim...:)

Öncelikle şöyle bir isim alanımız olsun:

#include <cmath>
 
namespace abo {
  class ibo {
    public double sinPi() {
      return ::sin(M_PI);
    }
  };
}

Şimdi biz sinPi() işlevini çağırabilmek için using abo::ibo; yaptıktan sonra ibo::sinPi() şeklinde çağırmamız gerekiyormuş. Farkındaysanız soruyu sorup kolaya kaçmadım, öğrenmeye çalıştım...:)

Ancak anlamadığım ve hata veren şeyler var! O da return ile dönüş yapılırken, solu boş :: (iki nokta üst üste) ile sanırım std::'nin isim alanına erişilmeye çalışılıyor; ya da ibo isim alanından çıkılmaya, öyle değil mi? Eğer öyleyse niye hata vermekte?

/tmp/ccTFYkOS.o: In function `pt::DMath::fix(double, double)':
test.cpp:(.text._ZN11prayertimes5DMath3fixEdd[pt::DMath::fix(double, double)]+0x28):
undefined reference to `sinPi'
collect2: ld returned 1 exit status
make: *** [p] Hata 1


Bir de bazen sadece tek nokta kullanıldığını görüyorum. Sanırım bir sınıf (örneğin ibo) falanca diye tanımlandığında bunu falanca.sinPi() şeklinde ulaşılıyor. Ama bu bir değişken olduğunda yine eski şekle dönülüyor, öyle değil mi?

Basit soruya, daha doğrusu cevaplanmaması gereken konulara girmek istersek; bizim ECMA uyumlu dillerde nesneler arasını nokta ile ayırmamız C++'da iki nokta üst üsteye denk geliyor olmalı. Belki de yanılıyorum, olay tamamen isim alanları (namespace) ile ilgili. C'de ise bir sınıf veya yapı içindeki nesneye -> işaretleri ile eriştiğimizi zannediyorum. Belki OOP denilen olaylar, BT dillerine başta hakim olsaydı, bu farklılıklar daha aza indirilmiş olacaktı diye düşünmekteyim.

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
#include <cmath>
 
namespace abo {
  class ibo {
    public double sinPi() {
      return ::sin(M_PI);
    }
  };
}

C++'ta public'ten sonra iki nokta üst üste olmalı: 'public:'.

Şimdi biz sinPi() işlevini çağırabilmek için using abo::ibo; yaptıktan sonra

Tam kodu verir misin lütfen. 'using abo::ibo' derleme hatasına neden oluyor.

ibo::sinPi() şeklinde çağırmamız gerekiyormuş.

Belirli bir kod üzerinde öyle olabilir ama öyle genel olarak söyleyince doğru değil.

solu boş :: (iki nokta üst üste) ile sanırım std::'nin isim alanına erişilmeye çalışılıyor

Hayır. Solu boş olduğunda "global isim alanındaki" demek olur.

Eğer öyleyse niye hata vermekte?

public'ten sonra : koymadığın için herhalde. :p

/tmp/ccTFYkOS.o: In function `pt::DMath::fix(double, double)':
test.cpp:(.text._ZN11prayertimes5DMath3fixEdd[pt::DMath::fix(double, double)]+0x28):
undefined reference to `sinPi'
collect2: ld returned 1 exit status
make: *** [p] Hata 1

Genel bir kural olarak, "Undefined reference" gördüysen derleme başarıyla sonlanmış demektir. O hatayı bağlayıcı verir. sinPi()'nin tanımı programda bulunmuyor.

Bir de bazen sadece tek nokta kullanıldığını görüyorum. Sanırım bir sınıf (örneğin ibo) falanca diye tanımlandığında bunu falanca.sinPi() şeklinde ulaşılıyor.

Noktanın anlamı "soldakinin sağdaki üyesi" demektir. Yani "falanca'nın sinPi" üyesi.

bizim ECMA uyumlu dillerde

O tanımı daha önce de duydum ama ne olduğunu bilmiyorum.  ECMA, C++ ve D ortamlarında geçen bir terim değil.

nesneler arasını nokta ile ayırmamız C++'da iki nokta üst üsteye denk geliyor olmalı.

C++'ta nokta "üyesi" demek.
C++'ta :: "o isim alanındaki" demek.

D'de nokta "üyesi" demek. İsim alanı değil de en dış olarak modül olduğu için modülün de üyesi olabiliyor. std.array.replicate() gibi...

C'de ise bir sınıf veya yapı içindeki nesneye -> işaretleri ile eriştiğimizi zannediyorum.

C'de de nokta ile erişilir. C'de ve C++'ta göstergelerin gösterdikleri nesnenin üyesine -> ile erişilir.

Ali
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Pardon hocam, basit olsun istemiştim; vur demiş iki nokta üst üsteyi de öldürmüşüm...:)

Tam olarak deneme kodum şuydu:
#include <cstdio>
#include <cmath>
 
namespace pt {
  class DMath {
    public:
    static double sinus(double d) {
      return ::sin(d);
    }
  };
}
 
using pt::DMath;
 
int main() {
  DMath matematik;
  //printf("Sin(Pi/2) 1 midir?: %.1f\n", std::sin(M_PI/2));/*<-- bu satır çalışıyor...
  printf("Sin(Pi/2) 1 midir?: %.1f\n", DMath::sinus(M_PI/2));//*/
  
  return 0;
}
Henüz sorunuma çözüm bulamasam da verdiğin cevaplar sayesinde '::' ile '.' arasındaki farkı daha fazla anlamaya başladım. Özellikle yukarıdaki örnekte Dmath'ı matematik diye bir nesne ismi olarak tanımladıktan sonra nokta ile erişebildiğimi farkettim. Zaten diğer şekilde olmuyor çünkü şu hatayı veriyor:
test.cpp:19:40: error: ‘matematik’ is not a class or namespace
V'el-hasıl kelam, şu 'undefined' hatası elimde koca bir ayva gibi durmakta...:)

Teşekkürler...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #4
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #2
acehreli:
O tanımı daha önce de duydum ama ne olduğunu bilmiyorum.  ECMA, C++ ve D ortamlarında geçen bir terim değil.

www.ecma-international.org sitesinde çok bilgi var ama kısaca alıntılarsam:

Since 1961 and continuing in full force today, Ecma International facilitates the timely creation of a wide range of global Information and Communications Technology (ICT) and Consumer Electronics (CE) standards, for:
  • Programming Languages;
  • ECMAScript;
  • Business Communications;
  • Near Field Communications;
  • High Rate Wireless Communications;
  • Product Safety;
  • Environmental Design Considerations;
  • Acoustics
  • Electromagnetic Compatibilty (EMC);
  • Optical Storage;
  • Universal 3D open file format;
  • Office Open XML Formats;
  • Open XML Paper Specification (OpenXPS).
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #3
'g++ (GCC) 4.4.5 20110214 (Red Hat 4.4.5-6)' ile derleniyor.

Ama başka bir hata yüzünden derlenmemesi gerekir. Sen <cmath> başlığını ekliyorsun. O başlıktaki bütün isimlerin std isim alanında olması gerekir. O yüzden sinus() içindeki '::sin' doğru olmamalı.

<cmath> eklediysen 'std::sin' olmalı, <math.h> eklediysen '::sin' olmalı.

Belki de derleyici gariplikleridir.

Ali
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
"Programming Languages" başlığı şurada:

  http://www.ecma-international.org/memento/TC49.htm

D'yi göremiyorum. C++ ile ilgisi de "CLI eklerinin standartlaştırılması" imiş. Yani diller arasında bir standart ile ilgisi olmadığı gibi C++ standardı ile de ilgisi yok. C++'a ek yapmanın standardından bahsediyorlar.

D ve C++ ortamlarında duymamış olmam normalmiş yani. ECMA o dillerin gelişiminin dışında bir kurummuş.

Ali
Avatar
Salih Dinçer #7
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler hocam,

Dediğin gibi g++ ile derleniyor ve bu hatayı ben gcc ile -o dışında hiç bir parametre vermeden alıyordum. Malum henüz gcc'nin çaylağıyım ve neler yazacağımı bilmiyorum...:)

İşin ilginci g++ ile cc'nin, gcc ile aynı şeyler olduğunu düşünüyorum, yanılıyor muyum?

Bir de cpp diye bir keşfettim ama onun bir derleyici olduğundan şüpheliyim. Sizce nedir?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-08-29, 14:08.
acehreli (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
g++ ile cc'nin, gcc ile aynı şeyler olduğunu düşünüyorum, yanılıyor muyum?

$ which cc
/usr/bin/cc
$ ll /usr/bin/cc
lrwxrwxrwx. 1 root root 3 Jul 14 18:33 /usr/bin/cc -> gcc


g++ ile gcc aynı programdır. Bu program başlarken argv[0]'ın ne olduğuna bakar. g++ ise derlerken C++ varsayar, değilse C varsayar.

Bir de cpp diye bir keşfettim ama onun bir derleyici olduğundan şüpheliyim. Sizce nedir?

$ man cpp

;) Yani C önişlemcisi.

Ali
Avatar
Salih Dinçer #9
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Linux, büyüksün...:)

Teşekkürler Ali hocam, ben bu komutları bilmiyordum. Bir simgenin neye bağlı olduğunu ve yolunu görebilmek çok güzel bir şey. Bu olay kütüphanelerde de işe yarıyorsa müthiş.

Linux Manuel dosyalarını ise bugüne kadar hiç kullanmamıştım. Belki 1 veya 2 ama uzun bir aradan sonra tekrar denedim. Pratik şeyler ve belki de bu gelenek Unix'den gelmekte öyle değil mi? Acaba kendiliğinden kurulan tüm programlar bu man dosyalarını da ihtmal etmiyorlar mı? Belki de Linux için yazılım geliştirirken bu geleneği biz de sürdürmeliyiz...

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-20, 01:30:21 (UTC -08:00)