Thread overview
C++ İsim Alanları Kullanımı
Aug 29, 2012
Salih Dinçer
Aug 29, 2012
Salih Dinçer
Aug 29, 2012
Salih Dinçer
Aug 30, 2012
Salih Dinçer
Aug 29, 2012
Salih Dinçer
August 29, 2012

Merhaba,

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

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

Alıntı:

>
> #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...

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
August 29, 2012

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:
Alıntı:

>

'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...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 29, 2012

Alıntı (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:

Alıntı:

>

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).

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 29, 2012

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?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 29, 2012

Alıntı (Salih Dinçer):

>

Alıntı:

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


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

Alıntı:
> Ş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.

Alıntı:
> **ibo::sinPi()** şeklinde çağırmamız gerekiyormuş.

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

Alıntı:
> 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.

Alıntı:
> Eğer öyleyse niye hata vermekte?

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

Alıntı:
>
> '/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.

Alıntı:
> 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.

Alıntı:
> 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.

Alıntı:
> 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...

Alıntı:
> 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

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
August 29, 2012

'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 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ı.

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

Belki de derleyici gariplikleridir.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 29, 2012

"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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 29, 2012

Alıntı (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.

Alıntı:

>

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

'$ man cpp'

;) Yani C önişlemcisi.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 30, 2012

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...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]