Sınıflar hakkında bir soru

Başlatan 0u2h4n, 09 Ağustos 2012 - 18:30:47

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

0u2h4n

#include <iostream>
using namespace std;

class InputNum
{
public:
InputNum ()
{
std::cout << "Enter number ";
std::cin >> _num;
}

int GetValue () const { return _num; }

void AddInput ()
{
InputNum aNum; // get a number from user
_num = _num + aNum.GetValue ();
}


private:
int _num;
};

int main()
{
InputNum num;
cout << "The value is " << num.GetValue() << "\n";
num.AddInput();
cout << "Now the value is " << num.GetValue() << "\n";
return 0;

}


C++ In Action Industrial Strength Programming Techniques kitabından yukarıdaki örneği incelerken anlayamadığım bir kısım oldu. AddInput metodu içinde _num değişkeni var. Bu değişkenden önce num ve aNum olmak üzere iki nesne tanımlanmış durumda. Bu _num değişkeni programı çalıştırınca görülüyor ki num nesnesine ait. Bunun nasıl olduğunu açıklar mısınız?

ct

private:
int _num;
};


ile sizin yarattığınız nesneye ait (field) değişken olarak tanımlanmış _num. Diğer bahsettiğiniz nesne ise parantezin içinde yani farklı bir bloğun içinde. c++ bilmiyorum ama kodu okuyabiliyormuşum :) Javacıyım.

0u2h4n

Alıntı yapılan: ct - 09 Ağustos 2012 - 20:17:51
private:
int _num;
};


ile sizin yarattığınız nesneye ait (field) değişken olarak tanımlanmış _num. Diğer bahsettiğiniz nesne ise parantezin içinde yani farklı bir bloğun içinde. c++ bilmiyorum ama kodu okuyabiliyormuşum :) Javacıyım.

farklı bir bloğun içinde tanımlanıyor ama _num değişkeni de aynı blok içinde kullanılıyor.

ct

Adım adım gitmeye çalışalım:

InputNum num;

ile num adında bir nesne oluşturduk. Bununla num'a ait _num değişkenini de yaratmış olduk. Ardından AddInput () metoduyla bir nesne daha oluşturduk. Dış bloktan gelen _num değerini orada kullanabildik ancak aNum nesnesinin değerine _num ile ulaşamıyoruz o içeride private/gizli bir değer ve ona ulaşmanın yolu GetValue() metodunu kullanmaktan geçiyor. Yani aNum'un _num değişkeni içerideki bir değişken ve ona ancak bu GetValue() ile erişebiliyoruz, aNum._num ile de ulaşabiliriz belki "public" haline getirmemiz lazımdır. Bu eriştiğimiz değeri de num nesnesine ait _num değişkenini değiştirirken kullanmış. Yani elimizdeki _num num'a ait olmuş oluyor.

Erdem

//------------------------------------
//  giris2.cpp
//  Üye İşlevlerin Kapsamı
//  (c) F.Erdem ÖNCEL , 2005
//------------------------------------

#include <iostream>

using std::cout;
using std::cin;

class SayiGiris
{
public:
    SayiGiris ()
    {
        cout << "Lütfen bir sayi girin ";
        cin >> sayi_;
    }
    int degerOgren () const { return sayi_; }
    void girileniEkle ()
    {
        SayiGiris birSayi; // Kullanıcıdan bir sayı al
        sayi_ += birSayi.degerOgren ();

        // sayi_ = sayi_ + birSayi.degerOgren ();
        // this->sayi_ += birSayi.degerOgren ();
    }

private:
    int sayi_;
};


int main ()
{
    SayiGiris sayi;
    cout << "Girilen sayinin degeri " << sayi.degerOgren () << '\n';
    sayi.girileniEkle ();
    cout << "Şimdi toplam " << sayi.degerOgren () << " oldu\n";
    return 0;
}




Şimdi şöyle düşünelim SayiGiris sayi diye bir nesne oluşturduğumuz zaman ne oluyor. SayiGiris'in varsayılan kurucusu çağrılıyor. Böylece sayi nesnesinin sayi_ isimli üye değişkeni girdiğimiz değeri alıyor. Çok iyi çok güzel..

SayiGiris sınıfının girileniEkle() üye işlevini çağırdığımız zaman ise bir tane daha SayiGiris sınıfına ait birSayi isimli bir nesne oluşturuluyor.  Ama şu farkla ki birSayi nesnesinin yaşam alanı (kapsamı) sadece girileniEkle üye işlevinin küme parantezleri arasında. Yani bu işlevden çıkar çıkmaz birSayi nesnesi için ayrılan bellek alanı geri verilecek ve birSayi nesnesinin bozucu işlevi çağrılacak.

girileniEkle işlevinin küme parantezleri arasında da SayiGiris birSayi; şeklinde sınıfımızın kurucu işlevini çağırdığımız için tekrar bize sayı değerlerini girmemizi isteyecek. Bu değerler bu sefer birSayi nesnesinin sayi_ isimli üye değişkeni bu değeri alacak. Sonra bu değişkeni hala mevcut olan sayı değişkenimizin sayi_ isimli üye değişkenine atıyoruz. İşlevden çıkıldığı anda birSayi değişkeni için ayrılan bellek alanı geri veriliyor.

Çok çok önemli olmasa da üye değişkenlere isim verirken sonek olan kullanımın örneğin int birSeyler_ gibi int _birSeyler'e göre daha yaygın olduğunu görüyorum.

Bu arada doğru yoldasın  :D Ama iyi, temiz ve basit C++ kodu yazabilmek oldukça uzun zaman alabilir. Bu geçenlerde ceviz forumlarında da  konuşulmuştu.

http://forum.ceviz.net/c-c/119775-c-hakkinda-dusunceleriniz.html

Ben olsam şahsen D öğrenirdim  ;)

sem

Faaliyet, bilinirlik ve ömür alanı bölümünü okuduğunuzda ya da tekrar ettiğinizde bu soruyu kendiniz yanıtlayacaksınız.

Soruyu net olarak anlayamadım ama konunun ne ile alakalı olduğunu anladığım için böyle söyledim. Yoksa ben paylaştığınız kodda üye değişkeni kullanan üye bir fonksiyon görüyorum. üye fonksiyonlar daima sınıfın üye elemanlarına erişebilirler.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

0u2h4n

Teşekkürler ct, Erdem, sem0900..

Alıntı yapılan: Erdem - 09 Ağustos 2012 - 21:46:25

Bu arada doğru yoldasın  :D Ama iyi, temiz ve basit C++ kodu yazabilmek oldukça uzun zaman alabilir. Bu geçenlerde ceviz forumlarında da  konuşulmuştu.

http://forum.ceviz.net/c-c/119775-c-hakkinda-dusunceleriniz.html

Ben olsam şahsen D öğrenirdim  ;)

C, C++, D gibi diller hakkında pek bi bilgi sahibi olmadan birini seçmek çok zor. Ben iş başvurularına baktığımda C++ bilmek çok gerekli gözüküyor. Bu yüzden C++'ı seçtim. Belki yolun çok başındayım ama bırakmak istemiyorum  :D.

sem

Bence doğru yoldasınız =) C++ öğrendikten sonra Java da C# da C de benzer ve basit gelecektir. C, C++, C# ve Java'nın söz dizimi aynı zaten... Dillerin getirdiği özellikler değişiyor elbette.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

0u2h4n

Bu konunun altına pek iyi olmayacak ama yeni konu da açmak istemedim. Biraz genel tavsiyelere ihtiyacım var.

Yaklaşık 2 hafta önce Ubuntu ve C++'a merak saldım. Ama nasıl ilerlemem gerektiğini bilmiyorum ve biraz ufkumun genişlemesi lazım bu konularda.  Zaten ubuntu kurdum ama windows gibi kullanıyorum. İnternete girmek, dizi izlemek bi de eclipse de C++ kodları. Konsolu açmıyorum bile çünkü ne yapmam gerektiğini bilmiyorum. C++'a gelince onu da ingilizce kaynaktan çalışıyorum. İngilizce olmasından ötürü çabuk sıkılabiliyorum. Bir şeyler üretmem lazım sıkılmamak için ama ne yazacağımı bilmiyorum. Sadece okuyarak ilerlenmiyor ve hiç bir işe yaramıyormuş gibi geliyor.

sem

Forumda örnek bir çok program var.. C, Bash, Python vs ile yazılmış.. Bunlardan seviyenize göre olanları C++'a çevirerek sıkılma aşamasını geçebilirsiniz... Forumda kaynak kod dolu =) Dişinize göre olanları çevirip hem de C++'a yeni başlayan arkadaşlara kaynak kod vermiş olarak büyük bir kaynak da sağlamış olursunuz =)...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

Erdem


  • C++ konusunda forumları ve haber gruplarını takip edersen kısa sürede çok yeni şeyler öğrenebileceğini düşünüyorum. Ayrıca takıldığın yerlerde yardım alabilirsin. Bu yüzden ceviz c++ forumlarını takip etmeni tavsiye ederim.

    http://forum.ceviz.net/c-c/
  • Konsol'a yakınlaşmak istiyorsan Emacs kullanmayı öğrenerek işe başlayabilirsin.



    Bu adreste çok hızlı bir şekilde bahsetmiştim.
  • Gene daha önce bahsettiğim Accelerated C++ kitabını alıp okumanı tavsiye ederim.

    http://www.acceleratedcpp.com/

    Yazarlarının her ikisi de eğitimci olduğu için en başından tamamen uygulamaya yönelik örnekler yazıyorsunuz.
  • Biraz SDL öğrenip C++'deki öğrendiğiniz bilgileri pratiğe geçirip ufak oyunlar yazabilirsiniz:

    http://lazyfoo.net/SDL_tutorials/index.php

Benim için de tam tersine vakit yetmiyor  :D O kadar yapılacak şey var ki.

Bir taraftan bu aralar bir arkadaşın da gaza getirmesiyle tekrar oyun programlamaya dönüp bu kütüphanede eksik kalanları tamamlasam mı diyorum.

https://github.com/erdemoncel/oyun

Tamamlamaya fırsat olmayacağını biliyorum  ;) O yüzden şu aralar C++ ve Ruby ile yazılmış bu oyun kütüphanesini inceliyorum.

http://ddili.org/forum/thread/917

Şu an bilgisayarıma bir delikli deneme kartı bağlı ve ona da bir LCD panel takılı. Şu an D ile paralel port üzerinden LCD panele yazı yazmak için programı hazırlıyorum.

https://github.com/erdemoncel/elektronikhobi

Gene eğer vaktim olsa beaglebone denilen bu oyuncakla ilginç uygulamalar yapabilirim  :D



PIC C ile sıcaklık uygulamalarında eksik kalan konuları tamamlayabilirim.



https://github.com/erdemoncel/sicaklik

Ama asıl yapmam gereken şeylerden bir tanesi 6.002x derslerini tekrar etmek. Ve ders kitabındaki örnekleri yapmak.

http://www.youtube.com/watch?v=LOOsbsBLT7M

Arada elektronik ve robotik konusunda aldığım ama kapağını açma fırsatı bulamadığım bu  kitapları okuma fırsatı bulabilirsem harika olur  :D

http://amzn.com/lm/RQXZ109K68G7B


0u2h4n

Alıntı yapılan: Erdem - 10 Ağustos 2012 - 21:40:19
Gene daha önce bahsettiğim Accelerated C++ kitabını alıp okumanı tavsiye ederim.

http://www.acceleratedcpp.com/

Yazarlarının her ikisi de eğitimci olduğu için en başından tamamen uygulamaya yönelik örnekler yazıyorsunuz.

C++ In Action Industrial Strength Programming Techniques kitabına başlamıştım. Bunu bırakıp Accelerated C++'ye başlayım mı? İkisinin de pdf'leri var onlardan çalışacağım.

Alıntı yapılan: Erdem - 10 Ağustos 2012 - 21:40:19
Biraz SDL öğrenip C++'deki öğrendiğiniz bilgileri pratiğe geçirip ufak oyunlar yazabilirsiniz:

http://lazyfoo.net/SDL_tutorials/index.php

C++ ve SDL'i paralel götürmek sıkıntı olabilir diye düşünüyorum ama emin değilim. Sizce beraber halledilir mi ?

Alıntı yapılan: Erdem - 10 Ağustos 2012 - 21:40:19
Benim için de tam tersine vakit yetmiyor  :D O kadar yapılacak şey var ki.
Aslında bende aynı dertten muzdaribim. Öğrenmek istediklerimin süreçleri uzun ve ben sabırsızlanıyorum. Daldan dala atlayarak kendimi hiçbir şey öğrenmemiş gibi hissediyorum ve sıkılıyorum. :)


Ayrıca elektronikle ilgili bahsettiklerinden merak ettiğim bir konu var :D. Elektronikle hobi olarak mı ilgileniyorsunuz yoksa Elektronik Mühendisi misiniz ?

Erdem

Alıntı yapılan: 0u2h4n - 11 Ağustos 2012 - 14:27:18
C++ In Action Industrial Strength Programming Techniques kitabına başlamıştım. Bunu bırakıp Accelerated C++'ye başlayım mı? İkisinin de pdf'leri var onlardan çalışacağım.

İlkönce şunu söylemeliyim ki C++ In Action çok kaliteli bir kitap. Yazarı Bartosz Milewski de zamanında Microsoft'da yazılım mühendisi olarak çalışmış. Kitapta da bu pratikte uyguladığı programlama tekniklerini kullanıyor. Örneğin ikinci bölümde MVC (Model View Controller) tasarım desenini Win32 programlamada kullanıyor. Ama diğer taraftan Win32 API programlama herkes için çok cazip olmayabilir. Gerçi ben Ubuntu'da Win32 API uygulamalarını kodlamıştım  ;) Ama sırf bu ilk bölümde anlattığı programlama teknikleri için bile okunması gereken bir kitap olduğunu düşünüyorum. Bu kitabın  yeni baskısını istesen de basılı olarak bulabileceğini pek tahmin etmiyorum. Belki ikinci el olarak bulabilirsin.

Accelerated C++'ye gelince yazarlarının her ikisi de akademisyen. Akademisyen derken bir üniversitede zaten yıllardır öğrencilere C++ kursu vermişler. Kitap baştan sona C++'ı uygulamalı olarak örneklerle doğru bir şekilde öğretiyor.

Bir de şöyle bir şey var. Örneğin Andrei Alexandrescu müthiş bir adam. C++ konusunda en büyük ustalardan birisi. Ama kendisi Romen asıllı olduğu için aksanı var ve kitaplarında örneğin bunun gibi örnekler kullanabiliyor. Ben şahsen kendi ana dilim gibi yabancı dil bilmediğim ve onların kültürüne yabancı olduğum için bazı örneklerde biraz zorlandığımı itiraf etmeliyim. Ama söylediklerim yanlış anlaşılmasın Andrei büyük bir usta ve yazdığı Modern C++ Design gibi kitaplar ileri düzey C++ anlatıyor.

Demek istediğim Accelerated C++'nin yazarları yıllardır öğrencilerin o konuyu ne oranda öğrendiklerini ölçme gibi bir avantajı olmuş. Bu yüzden zamanla kursların ve dolayısıyla kitabın içeriğini değiştirmişler.

Hatta bu konuda ACCU'da Francis Glassborow'un bu konudaki incelemesini okumak isteyebilirsin. İlk satırı "Bu uzun zamandır çıkmasını dört gözle beklediğim bir kitaptı" diye başlıyor  :D

http://bit.ly/P8VdqR

O yüzden Accelerated C++ başlangıç için çok harika olur. Sonra C++ In Action ve diğer kitaplarla devam edebilirsin.

Elektronik kitap konusunda benim de zaman zaman hakkında güzel yorumlar duyduğum kitapları nasılmış deyip göz gezdirdiğim oluyor. Ancak daha sonra eğer o kitabı okumak istiyorsam basılı halini satın alıyorum. Bunun nedeni hem bilgisayar ekranından uzun süre bir şeyler okuyamıyorum hem de ben bir kitaptan faydalanıyorsam o yazarın emeğinin karşılığını da vermek gerekir diye düşünüyorum. Maddi açıdan belki bu düşünülebilir ama elektronik kitabın çıktısını almak bile hemen hemen kitap fiyatına geliyor. Eğer Amazon'dan satın alma imkanı yoksa pandora gibi kitapevleri yabancı kitapları getirebiliyorlar.

http://www.pandora.com.tr

Alıntı yapılan: 0u2h4n - 11 Ağustos 2012 - 14:27:18
C++ ve SDL'i paralel götürmek sıkıntı olabilir diye düşünüyorum ama emin değilim. Sizce beraber halledilir mi ?

Benim düşüncem Accelerated C++ gibi bir kitabı okuduktan sonra SDL anlatan derslerdeki C++ kodu çok basit gelecek. Hatta kendinin yazarlara göre daha iyi C++ bildiğini düşünecek ve kodu geliştirmeyi düşüneceksin  ;)

Bu arada SDL'in yerine Allegro da iyi bir alternatif olarak düşünülebilir:

http://www.emunix.emich.edu/~evett/GameProgramming/allegro_howTo.html

Alıntı yapılan: 0u2h4n - 11 Ağustos 2012 - 14:27:18
sıkılıyorum. :)

Ben sıkılmıyorum vakit yetmiyor sadece  :D

Alıntı yapılan: 0u2h4n - 11 Ağustos 2012 - 14:27:18
Ayrıca elektronikle ilgili bahsettiklerinden merak ettiğim bir konu var :D. Elektronikle hobi olarak mı ilgileniyorsunuz yoksa Elektronik Mühendisi misiniz ?

Ben programcıyım. Ankara Üniversitesi mezunuyum. Sonraları elektronik çok cazip gelmeye başladı. Şimdiki aklım olsaydı elektronik okurdum  :D

Elektronikle hobi olarak uğraşıyorum.

0u2h4n

Bende elektronik mühendisliğinden bu yıl mezun oldum. Eğer uygunsa özelden bazı sorularım olacak, uygun mudur :D

Erdem

Tebrikler!   :D

Programlamayla ilgili teknik konuların forumlarda konuşulmasını daha doğru buluyorum. Çünkü ben de takip ettiğim forumlarda hiç o başlık altında bir cevap yazmasam da her gün yeni bir şey öğreniyorum.

Diğer konularda neden olmasın  :)