PDA

Tam Sürümünü Görmek İçin : initialize


quasimodo
23/10/2007, 13:23
MyClass {
int yas;
double boy;
char cinsiyet;
public :
//.....
};

Boyle bir sinifin nesnesine nasil
MyClass mc = {23, 1.86, 'm'};
seklinede ilk deger verebilirim?
Yada nasil bir sinifa bu sekilde ilk deger verebilirim ?


acehreli
23/10/2007, 21:03
(Bence baska bir sey soruyorsun ama ben boyle anladim. :) )

Derleyici bizim nesnemizin nasil kurulacagini bilemeyecegi icin, oncelikle bir kurucumuzun olmasi gerekir. Cok basit olarak:


class MyClass {
int yas_;
double boy_;
char cinsiyet_;

public:

MyClass(int yas, double boy, char cinsiyet)
:
yas_(yas),
boy_(boy),
cinsiyet_(cinsiyet)
{}
};

int main()
{
// Iste boyle:
MyClass mc(23, 1.86, 'm');


// Dizileri kurarken de kullaniriz:
MyClass mcler[] = {
MyClass(23, 1.86, 'm'),
MyClass(23, 1.86, 'f'),
};

mcler[0] = mcler[1];
}


Ali

myavuzselim
23/10/2007, 21:37
Soyle bir kod g++ ile derleniyor:
#include <iostream>

class A {
public:
int x;
char* y;
};

int main() {
int x = {1};
A a = {3, "merhaba"};
std::cout << a.x << ", " << a.y << std::endl;
std::cout << x << std::endl;
return 0;
}
Ayrica sonra google'da biraz aradim, ancak bunu (http://groups.google.com/group/comp.lang.c++/tree/browse_frm/thread/fa1bf288109ecc99/13ac32938957d2bd?rnum=11&_done=%2Fgroup%2Fcomp.lang.c%2B%2B%2Fbrowse_frm%2F thread%2Ffa1bf288109ecc99%3Ftvc%3D1%26#doc_3bfff4b c394bde12) bulabildim.

acehreli
23/10/2007, 22:41
Burada galiba A bir POD (plain old data) oldugu icin calisiyor. Bir kurucu islev tanimlayinca calismamasi gerek...

Ali

myavuzselim
24/10/2007, 00:34
acehreli, evet, constructor olunca calismiyor.

quasimodo
25/10/2007, 15:46
Evet aslinda baska bir sey sormak istedim. Aslinda sorum suydu;
, vigul oparatorunu asiri yukleyim class in elemanlarina ilk deger
verebilirmiyiz?

Myclass mc = 12, 123, -12;

acehreli
25/10/2007, 20:36
Oncelikle, yazim kurallari disinda oldugu icin en azindan kafa karistiracagi icin onerilmez. Zaten

MyClass mc(12, 123, 'a');

yazmak daha kisa. :)

Yine de bununla biraz ugrastim ama iki teknik konuya takildim:

1) 'operator,' temel turler icin yuklenemiyor. Onun icin temel turler yerine de kullanilabilecek yeni kullanici turleri kullanmak gerekir:

MyClass mc = Benim_int(12), Benim_double(123), Benim_char('a');

2) Tabii simdi yukledigimiz virgul islecinin sonucunun MyClass olmasini istiyoruz. Ama baska sinifin da (int, double, char) parametreleri olsa ne yapacagiz? Onun icin de ayri bir duzenek mi gerekecek? Yoksa

BaskaSinif = Benim_int(12), Benim_double(123), Benim_char('a');

yazdigimizda sag taraf yukleme sonucu olarak MyClass verecektir.

Onun icin, yuklemeyi bir sablon olarak yazip, sonuc turunu de acikca belirtebiliriz. Bu durumda Benim_int gibi siniflara da gerek kalmaz:

BaskaSinif = BenimYuklemem<BaskaSinif>(12, 123, 'a');

Ben sevmedim... :p

3) Temel turler icin yuklenebilir olsa bile, virgul islecinin temel bir ozelliginin onune gecemiyoruz: virgul islecinin sonucunun tUrU, en sondaki ifadenin tUrUdur.

MyClass mc = 12, 123, 'a';

yaziminin calisabilmesi icin MyClass'in 'char' tUrUnden bir nesne ile kurulabiliyor olmasi gerekir. 12 ve 123 de kullanilmamis olur.

Yani sonucta bu gibi sihirbazliklari getirisi yuksek olan yerlerde kullanmak daha dogal. Ornegin, Boost'un Lambda kutuphanesinin belgesinden bir ornek:

http://www.boost.org/doc/html/lambda/using_library.html#lambda.introductory_examples


vector<int> vp;
vp.push_back(1);
vp.push_back(42);
// vs.
for_each(vp.begin(), vp.end(), cout << _1 << '\n');


vp'nin ogelerinin her birisi icin ("for each") ucuncu parametredeki ifade isletiliyor. Tabii dil desteklemedigi icin, bunu ancak islec yukleme sihirbazliklarina girerek basariyorlar.

Oradaki _1, vp'nin her bir ogesini belirlemek icin kullanilmis. Kendisinin yuklemeleri gerceklestirmek icin bir sablon tUrU var. (Benim yukarida Benim_int vs.'yi dusunme nedenime benzer olarak.)

Sonucta butun 'cout << _1 << '\n'' islemi aslinda daha sonradan her bir oge icin isletilmek icin bir islev nesnesine (function object) dOnUsuyor.

Boost'tan baska ilginc bir kutuphane, 'assign':

http://boost.org/libs/assign/doc/index.html


vector<int> values;
values += 1,2,3,4,5,6,7,8,9; // bunlari toplulugun sonuna ekle


Tam da virgul islecini yuklemisler orada. :) Veya:


map<string,int> months;
insert( months )
( "january", 31 )( "february", 28 )
( "march", 31 )( "april", 30 )
( "may", 31 )( "june", 30 )
( "july", 31 )( "august", 31 )
( "september", 30 )( "october", 31 )
( "november", 30 )( "december", 31 );


Orada insert(months)'tan sonra bir suru parantez aciliyor. O da, bir onceki sonuc hep bir islev nesnesi oldugu icin calisiyor. Zincirleme olarak gecici islev nesnelerine parantez acip kapatiliyor.

O iki ornekte de yazim kurallarinin disina cikilmis ve tanimayanin kafasini karistirir. Ama bence bu durumda hem cok yararli, hem de ne oldugu cok acik.

Uzun oldu... :)

Kisacasi: Islec yukleme, nesne ilklemek icin degmez ama baska islerde yararli olabilir. :)

Ali