Tam Sürümünü Görmek İçin : sizeof class
class x {
//...............
................//
class x1 {
//..........
.............//
};
class x2 {
//.........
..........//
};
class x3 {
//..........
............//
};
};
Bu şekildeki bir yapının boyutunu bulmak için hepsi için sizeof(x)+sizeof(x1)+sizeof(x2)+sizeof(x3) yazmaktan baska daha kısa bir yazım var mı? Ayrıca bu sekilde sınıfları iç içe yerleştirmenin bir sakıncası var mı?
tesekkur ederim...
Arkantos
30/04/2004, 19:12
Ayrıca bu sekilde sınıfları iç içe yerleştirmenin bir sakıncası var mı?
Şimdi burada yapılmak istenen ne? (has-a relationship) Türkçe ifadesiyle gömülü nesneler mi kullanmak istiyoruz ? Eğer öyleyse ve kodu biraz düzenlersek şuna benzeyecek:
class A
{
class B
{
};
class C
{
};
class D
{
};
};
Tekrar değişkenlere anlamlı isimler verir ve kodu düzenlersek:
#include <iostream>
using std::cout;
class Araba
{
public:
Araba (int no)
: numara_ (no), far_ (numara_)
{
std::cout << numara_ << " numarali araba olusturuldu\n";
}
private:
class Far
{
public:
Far (int no)
: numara_ (no)
{
std::cout << numara_ << " numarali araba icin far olusturuldu\n";
}
private:
const int numara_;
};
class Kapi
{
};
class Cam
{
};
const int numara_;
const Far far_;
};
int main ()
{
Araba araba (3);
// Far far (2); hata verir.
}
Burada main içinde örneğin far türünde bir nesneyi oluşturamayız. Eğer main içinde alt nesneleri de kullanmak istiyorsak şu şekilde kullanabiliriz:
#include <iostream>
class YatayCubuk
{
public:
YatayCubuk (int no)
{
std::cout << "+";
for (int i = 0; i < no; i++)
std::cout << "-";
std::cout << "+\n";
}
private:
};
class DikeyCubuk
{
public:
DikeyCubuk (int no)
{
for (int i = 0; i < no; i++)
std::cout << "|\n";
}
private:
};
class Cerceve
{
public:
Cerceve (int yat, int dik)
: ust_ (yat), sol_ (dik), alt_(yat)
{
}
private:
YatayCubuk ust_;
DikeyCubuk sol_;
YatayCubuk alt_;
};
class Merdiven
{
public:
Merdiven (int yat, int dik)
: ust_ (yat, dik), orta_ (dik), alt_ (yat, dik)
{
}
private:
Cerceve ust_;
DikeyCubuk orta_;
Cerceve alt_;
};
int main()
{
Cerceve (3, 1);
Merdiven (2,5);
return 0;
}
Ama yine de bu şekilde sınıfları içiçe kullanmanın pek iyi bir fikir olup olmadığı konusunda emin değilim :)
main icerisinde
int main()
{
Araba::Far far ;
..................
..............
}
şeklinde kullanılabiliyor.Asıl ogrenmek istedigim bu yapının veya daha genis ifade
edersem cok fazla class olusturmanın olumsuz bir etkisi var mıdır?
Bir tek class icinde tanımlanabilecek 20 değişken olsun.Bunlarda 5 erli olarak benzer işlemlerde kullanılsınlar.Bu durumda her 5 li, koda sonradan eklemeler yapmayı ve kodun anlaşılırlığını kolaylaştırsın diye ayrı veya boyle ic ice gomulu sınıflara yerleştirilirse programın calısmasına ne gibi etkileri olur.Yavaslatır mı?Cok mu bellek kullanır?
acehreli
01/05/2004, 08:01
ceeyt, basta yazdigin sizeof'lu toplamin sinifin buyukluguyle bir ilgisi yoktur. Ornegin:
class Dis
{
class Ic
{
int bir_;
int iki_;
};
int uc_;
public:
/* ... */
};
Cogu sistemde sizeof(Dis::Ic) 8 iken, sizeof(Dis) 4'tur. Cunku Dis'in yalnizca bir tane ogesi vardir: uc_.
Siniflari baska siniflarin icinde tanimlamak yalnizca onlarin erisimlerini kisitlar. Ic, Dis'in islevleri tarafindan erisilebilen bir siniftir. Bunun disinda Dis'in boyutuna bir etkisi yoktur.
Yukaridaki paragraftaki erisim kisitlamasi nedeniyle, main icinde
Araba::Far far;
yapamiyor olman gerekir. Eger derleyicin buna izin veriyorsa, bozuktur...
Kodu parcalara ayirmanin hemen hemen hicbir zarari yoktur. Belki fazladan islev cagrilari nedeniyle olculemez derecede yavaslatabilir... (Yani yavaslatmaz!). :) Parcalara ayirmanin bir yan etkisi ile fazla bellek de kullaniyor olabilir ama bu da cogu durumda onemli degildir.
Ozellikle, yukaridaki ornekteki gibi, ic siniflar olusturmanin kod buyukluguyle bir ilgisi olmadigini tekrarlamak istiyorum: O, yalnizca erisimle ilgilidir...
Ali
main icerisinde
Araba::Far far;
kullanimi acaba microsoft vc++ ta mı mumkun olabiliyor? Simdiye kadar herhangi bir hataya neden olmadi,olmaz diyorsaniz kod degisecek,care yok :)
diger soruma yanıtlarınız icin tesekkur ederim...
Arkantos
01/05/2004, 16:58
Eğer main içerisinde Araba::Far far; kullanımı derken benim yazdığım birinci koda göre konuşuyorsak bunun hata vermesi gerekir. Ben kendi denemelerimde VC++ Toolkit 2003 (http://msdn.microsoft.com/visualc/vctoolkit2003/) içerisinde bulunan MS C++ derleyicisiyle o şekilde kullandığımda şu hatayı aldım:
Error C2512: Can not access private class declared in class 'Araba'
MS'in C++ derleyicisinin de standartlara oldukça uygun bir derleyici olduğu söyleniyor. Yine DevCpp'de denediğimde yine buna benzer bir hata aldım. Sanırım o da derleyici olarak gcc kullanıyor.
Sonuçta eğer sizin kullandığınız derleyici kodu bu şekilde derliyorsa bence kodu değiştirmekten çok derleyiciyi değiştirmek daha yerinde bir davranış olur :)
Kögüdey Meygen
01/05/2004, 22:27
public: kelimesini sınıfı tanımlamadan önce belirtmek gerek.Yoksa "private" bir sınıf tanımı yapıldığından dışarıdan kullanmak mümkün olmaz.
class Dis
{
public:
class Ic
{
acehreli
01/05/2004, 23:57
'public' yaparak ic sinifi baskalarinin
erisimine acabiliriz tabii ama ic siniflar genellikle
siniflarin ozel isleri icin tanimlandiklari icin galiba
'private' olduklarini varsaymisiz.
Cunku baskalarinin erisebilecegi bir sinifi zaten kendi
basina disarida da tanimlayabiliriz.
Aslinda gosterdigin gibi 'public' olarak sinif
tanimlamanin eski bir kullanimi vardi. C++'a ad
alanlari eklenmeden once, mantiksal olarak bir arada
bulunmasi gereken bir cok sinif ad karisikliklarini
engellemek icin, onlari kapsayan ayri bir
sinif icinde 'public' olarak tanimlanirdi:
class Hayvanlar
{
public:
class At {/* ... */};
class Esek {/* ... */};
/* ... */
};
class Emirler
{
public:
class At {/* ... */};
class Tut {/* ... */};
/* ... */
};
Boylece iki At sinifi karismamis oluyordu. Tabii ayni
isi simdi ad alanlari kullanarak hallediyoruz:
namespace Hayvanlar
{
class At {/* ... */};
class Esek {/* ... */};
/* ... */
}
namespace Emirler
{
class At {/* ... */};
class Tut {/* ... */};
/* ... */
}
Ali
Arkantos
02/05/2004, 00:10
Peki şunlar arasında bir fark varmıdır?
class Deneme
{
int deger_;
public:
/* ... */
};
ya da
class Deneme
{
public:
/* ... */
private:
int deger_;
};
Yani kısacası bu public, private, protected kısımlarını istediğimiz sırada kullanmanın bir mahsuru var mı? Bir de fonksiyon ve sınıf isimlerinin yazımında yaygın kullanılan bir notasyon var mı? İlk harf büyük küçük vs.. gibi
Peki şunlar arasında bir fark varmıdır?
class Deneme
{
int deger_;
public:
/* ... */
};
ya da
class Deneme
{
public:
/* ... */
private:
int deger_;
};
Yani kısacası bu public, private, protected kısımlarını istediğimiz sırada kullanmanın bir mahsuru var mı? Bir de fonksiyon ve sınıf isimlerinin yazımında yaygın kullanılan bir notasyon var mı? İlk harf büyük küçük vs.. gibi
public, private public kısımların sıralamasında yanlıs bilmiyorsam istediginz sırada kullanabilirsiniz.
Notasyon konusuna gore; bircok cesit notasyon vardır; Ama bunların bir standartı direkt yoktur. Alıskanlıktır...
GNU notation,
MS notation :)
vs vs
acehreli
04/05/2004, 00:54
RaiST'in yanlis bilmedigi gibi, :) erisim bildirimlerini
istedigimiz sirada ve istedigimiz kere kullanabiliriz:
class Sinif
{
public:
void foo();
private:
int i_;
public:
void bar();
private:
int j_;
};
Ben boyle bir seye cok ender gerek duyarim. Benim
ayni erisim bildirimini birden fazla kere kullanmamin tek
nedeni, kullanicilara sundugum bir turu tanimlamak icin olur:
class Sinif
{
public:
typedef vector<int> Sayilar;
private:
Sayilar sayilar_;
/* diger ozel islevler */
public:
Sayilar const & sayilar() const
{
return sayilar_;
}
/* diger genel islevler */
};
// Kullanici kodu da soyle olabilir:
void Foo(Sinif const & sinif)
{
Sinif::Sayilar const & sayilar = sinif.sayilar();
/* 'sayilar'i bir sekilde kullan */
}
Ali
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.