class içerisinde başka bir classtan oluşan nesne dizisi için pointer tanımlama

Başlatan carpediem, 06 Mart 2012 - 00:09:44

« önceki - sonraki »

0 Üyeler ve 3 Ziyaretçi konuyu incelemekte.

carpediem

Öncelikle c++ da ilk kez kod yazdığımı ve nesne yönelimli programlamada ilk deneyimim olduğunu belirtmeliyim :) Şu an üzerinde uğraştığım bir ödevim var ve ödevde bir yerlerde sanırım bilgi eksikliğinden kaynaklanan hatalar almaktayım.. ödevde 2 tane class kullanmaktayım, bunlar özetle:

class A
{
     B *ptr;
    //diğer attribute lar

    public:
   / / costructor lar, methodlar..
};

class B
{
    //private olan attributelar
};

A::A() //constructor
{
ptr=new B[size];
}

bool A::ekle(B &b)
{
        ptr[counter]=b;
        cout<<ptr[counter]<<endl;
        counter ++;
       
}


burada özetle yapmak istediğim, elimde olan bir classa, diğer classtan dinamik olarak oluşturulan nesne dizisinin başlangıç adresini tutan bir pointer eklemek ve böylece kendisine diğer classtan oluşturulan nesne dizisi eklenen class üzerinden,, eklenen nesnelerin içeriğini ekrana yazdırabilmek..ancak burada ekle methodu içerisinde
cout<<ptr[counter]<<endl;
olan yerde,  Error: no match for operator<< şeklinde bir hata alıyorum..nerde yanlışlık olduğunu anlayamadım,, yardım edilirse çok mutlu olurum gerçekten..şimdiden teşekkür ederim

sem

Burada kodun tamamını paylaşmamışsınız. Gördüğüm kadarı ile size değişkeni yok vs... Sanırım sadece fikir vermesi açısından ufak bir bölümünü paylaştınız.

Verilen hata ise; siz ptr[counter] ile şöyle bir şey yapıyorsunuz;

p[counter] hangi nesneye karşılık geliyor; B nesesi;

cout<< 5;

dersek << operatörü tam sayılar için tanımlı, ekrana ne yazılacağı biliniyor.

cout << "deneme"; dersek stringler için de aynı şekilde << operatörü tanımlı. Ekrana ne yazılacağı biliniyor... B sınıfını şöyle tanımladık diyelim;


class B
{
   int a;
  double b;
  char c;
};



şimdi

cout << B;

dediğiniz de << opetatörünün ne yapması gerektiğini bilmesi gerekir. int, char, double, string gibi sınıflarda ne yapacağını bilir fakat kullanıcı bir sınıf tanımladığında C++'ın ekrana yazdırma konusunda ne yapacağını bilmesini beklemek olmaz =) Burada ekrana yazdıracağınızı ya şu şekilde belirleyebilirsiniz;

cout << B.a << B.c << B.b ;

vs gibi doğrudan tanıdığı nesneleri << operatörüne gönderebilirsiniz.

Nesne yönelimli programla için ise şu soruda göze çarpan en belirgin eksiğiniz; "operator overload" olarak tanımlanan konu. << operatörünü kendi sınıfınıza göre "aşırı yükleyebilirsiniz"

C++ Operator Aşırı Yükleme (ya da overload)

olarak aratırsanız kaynak bulabilirsiniz. Kolay gelsin.


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 06 Mart 2012 - 09:19:09

EK: Javada bu şekilde nesneyi gönderince çıtkı fonksyionlarına adresi yazıyordu sanırım. Öyle miydi, emin olamadım şimdi =)
".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?

carpediem

Öncelikle çok teşekkür ederim gerçekten cevabınız için.. Dediğiniz gibi sadece taslak olarak bir kısım kodu paylaştım.. nesne yönelimli programlamada yeni olduğumdan operator overloading konusunu bilmiyordum sizin yazdıklarınız üzere cout overloading i araştırdım,,dediğiniz şekilde overloading yaparak cout la nesne de yazdırılabiliyormuş..ancak class içerisinde friend method yazılması gerekiyor bu durumda..ödevde ise friend method ya da class kullanılmasına izin yok.. ve yine yazdığınız gibi B class ından oluşturulan nesnenin değişkenlerini b.değisken1 şeklinde arada nokta kullanarak ayrı ayrı da ekrana yazdıramıyorum çünkü bunu yapmaya çalıştığım yer başka bir classtan oluştuduğum bir nesnenin methodu ve B classının değişkenlerinin tamamı da private olmak zorunda.. nasıl yapacağımı anlayamadım gerçekten, bu konuda bir fikriniz var mı?

sem

private üyelere erişmek için get and set arayüzleri oluşturabilirsiniz.

b sınıfına public tanımlı örneğin;

int getA()
{
return a;
}

fonksiyonunu B sınıfında tanımlarsanız private elemanların değerini elde edebilirsiniz... Genelde bu şekilde yapılır, dışarıdan değer atam için ise set arayüzleri yazılır. Google araması için anahar kelimeler ise =);

c++ getter setter



cout << B.a; şeklinde private olan bir değişkeni yazdıramazsınız fakat dediğim gibi işlem şuna dönecek;

cout << B.getA();

getA B sınıfının fonksiyonu olduğu için private elemanlara erişimi de olacak.
Kolay gelsin...
".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?

carpediem

Yardımcı olduğunuz için çok teşekkür ederim, daha öğrenmem gereken çook şey var anlaşılan  :D

sem

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

Alıntı yapılan: sem0900 - 06 Mart 2012 - 22:45:43
private üyelere erişmek için get and set arayüzleri oluşturabilirsiniz.

/* ... */

Google araması için anahar kelimeler ise =);

c++ getter setter

Aslında bazı c++ kitaplarında görülen set_bilmem_ne() get_bilmem_ne() gibi fonksiyonlar son derece nadir durumlarda kabul edilebilirler. Açıkça, çoğunlukla tasarım hatalarıdırlar...

Neden olduğuna gelince:

- get/set fonksiyonları üyeyi bütünüyle açarlar ve sarmayı delerler

- Eğer bütün üyelere get/set vereceksek sınıflara ne gerek var? Yapıları kullanabiliriz.

- set()'in yaptığını genelde kurucunun yapmasını bekleriz. Böylece ortalıkta ilklendirilmemiş değişken kalmamış olur.

- Her üyeye get/set kullanarak erişen örnekler tamamen yanlışlar. Bütün üyeleri public yapmak varken fazladan fonksiyonun yazmanın ne yararı olabilir?

Fazla vaktim olmadığı için uzun yazamıyorum.

Koda gelecek olursak kurucuda ayrılan bellek alanı bozucuda delete[] ile geri verilmeli. Aksi halde bellek sızıntısı oluşacaktır.

Üç işlevler kuralı gereği bir sınıfın kurucu, bozucu işlevi tanımlanmışsa kopyalama kurucusu ve atama işlevi de tanımlanmalı.

cout ile bir sınıfı çıkışa yazdırmak için bir örnek:

class hasta
{
    friend ostream & operator<< (ostream &, const hasta &);

    /* ... */
};

ostream & operator<< (ostream & cikis, const hasta & benim_hasta)
{
    // Istedigin gibi yazdir. Ornegin:
    cikis << benim_hasta.hasta_adi();
   
    return cikis;
}


Böylece hasta türünde bir nesneyi çıkışa göndermiş oluyoruz.

C++ konusunda kaynak kitap olarak şu kitapları tavsiye edebilirim:

http://www.relisoft.com/book/web_preface.html

(bu ücretsiz bir kitap)

http://amzn.com/020170353X
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

sem

Zaman sıkıntısından dolayı ben de biraz hızlı ve az yazacağım... Dedikleriniz duruma göre doğruluk gösterecek daha doğrusu duruma göre değişiklik gösterecek şeyler...

Örneğin set'in görevini kurucu yapacaksa eğer, tüm sınıf üyelerinin sınıf yaratıldığı anda değerinin bilinmesi gerekir. Ya da dediğiniz gibi tüm sınıf üyelerinin değeri kurucu işlevde belirlenecekse eğer dışarıdan hiç bir şekilde değiştirilmemesi gerekiyor. Bu durum her zaman geçerliliğini korumayacaktır elbet.

Tabii ki get ve set e tüm üyelerde değil de sadece public olmayanlarda ihtiyaç olacaktır.

Dediğiniz gibi bir çok durumda tasarım hatası olabilirler "belki" fakat bazı durumlarda da kaçınılmaz olacağı aşikar.
".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?

iskn90

public, private, protected gibi teknik şeyleri biraz araştır derim, eğer gerçekten iyi bir şekilde C++ öğrenmek istiyorsan içinde data structure anlatımları olan bir C++ kitabı almanı da tavsiye ederim,saygılar
Tell me and I'll forget,
Show me and I may remember,
Involve me (I do) and I'll understand (I learn)