PDA

Tam Sürümünü Görmek İçin : sınıf nedir? obje nedir? bunların veritipi ile bağlantısı nedir?


sckz
18/07/2005, 06:16
sınıf nedir? obje nedir? bunların veritipi ile bağlantısı nedir?


neolion
18/07/2005, 07:07
benim anladigim kadariyla;
sinif : cesitli veri tiplerini ve cesitli fonksiyonlari bir araya toplayarak olusturulan yeni bir veri tipi. Fonksiyonlari sayesinde bu tur cok fonksiyonel tabi...

obje: bu yarattigin yeni veri tipini kullanarak yarattigin degiskenlerdir.

veri tipi ile baglantisi: int a =10 ; orneginde,
"int" sinifa,
"a" objeye (nesne),
"=" eger bu sinif icin yeni bir operator tanimladiysan; bu da tanimladigin yeni operatore karsilik olabilir,

cok mu basit bi aciklama oldu ? :)

sckz
18/07/2005, 12:03
cok mu basit bi aciklama oldu ?Yo, teşekkür ederim.. anladım.. ama yinede bu konuda değişik bir fikri olanları duymak isteriz...

nilsonmandela
18/07/2005, 13:35
......

nilsonmandela
18/07/2005, 13:37
Bunu açıklamak için yapılardan bir giriş yapılabilir.Yapılar bir konuyla ilgili(ortak yönleri olan)çeşitli verileri tutmaya yarar.Örneğin:

struct Araba
{
float fiyat;
int parca_no;
};

Sınıflar ise yapıların fonksiyonlarında dahil edilmiş hali olarak tanımlanabilir.Buda nesne yönelimli programlamanın getirmiş olduğu bir avantajdır.Böylece yazmış olduğunuz kod daha anlaşılır ve derli toplu bir hal alır.Objelere (nesne) geldiğimizde ise şunları söyleyebiliriz:Nesneleri , tanımlandıkları sınıfın birer örneği olarak düşünebilirsiniz.Nesneler tanımlanmış oldukları sınıfın veri ve fonksiyonlarına sahiptirler.Fakat main() içinden bunlara ulaşmaları hakkında bazı kurallar da vardır.
Aşağıdaki örnek bir sınıfın ve bu sınıfa ait bazı nesnelerin (obje) tanımlanmasını göstermektedir.

class Araba
{
private:
float fiyat;
int seri_no;
public:
void veri_al()
{
cout<<"arabanin fiyat ve seri no sunu giriniz:";
cin>>fiyat>>seri_no;
cout<<endl;
}
void goster() const
{cout<<"fiyat:"<<fiyat<<" "<<"seri no:"<<seri_no;}
};
////////////////////////////////////////////////////////////////////////
int main()
{
Araba arb1;
arb1.veri_al();
arb1.goster();

return 0;
}

Sınıflar ve objelerle ilgili kısa bir bilgi böyle olabilir.Fakat sınıflar ve nesneler hakkında bilinmesi gereken çok daha fazla şey vardır.Sınıflar kalıtım gibi başka uygulamalarada imkan vermektedir.

carslan
18/07/2005, 13:57
Bir örnek verelim; bir bisiklet yapacaksın bunun için öncelikle bir kağıt üzerinde bisikleti tasarlarsın
bu bisikletin özelliklerini(properties):yani hangi renklerde olacağını, kaç vites olacağını, zincir uzunluğu gibi bilgileri,
hareketlerini(methods): hızlanması, yavaşlaması gibi
bunlar kağıt üzerindedir yani şablondur. İşte programlamadaki Class budur şablon yani.
Ben bisiklet şablonunu bir bilgisayar dilinde referans vererek tanımlarsam bu da bir Object(nesne) dir.Yani bir sınıfın object haline gelmesi için ilgili sınıfı kullanmam(referans etmem) gerekir.
Veri tipi ile ilgisi şudur ki;
Programlama dillerinde veri tipleri vardır nedir bunlar?
int
long
short
boolean
char vb gibi..
bunlar basit veri tipleridir.
Birde kullanıcı tanımlı veri tipi vardır(UDT) yani kullanıcının yarattığı veritipi
dikkat ediyoruz
Bisiklet veri tipi(class[sınıf]--->Bu şablon unutma)


Arama için anahtar kelime(Object oriented design)

Euclides
18/07/2005, 18:56
şimdi zehirli soruyu sorma zamanı geldi...

class ile yapılabilecek herşey tıpa tıp aynı şekilde(hiçbir fazlalık olmadan) struct ile de yapılabildiğinde göre neden class'a ihtiyaç duyulur ? neden kullanılır ?

mr1yh1
18/07/2005, 20:30
şimdi zehirli soruyu sorma zamanı geldi...

class ile yapılabilecek herşey tıpa tıp aynı şekilde(hiçbir fazlalık olmadan) struct ile de yapılabildiğinde göre neden class'a ihtiyaç duyulur ? neden kullanılır ?
C deki struct yapısı , pascaldaki record gibi, sadece veritipi tanımlıyordu...
nesne yönelimli programlama için değildi..
C++ da bu yapı genişletilmiş class becerisine kavuşmuş ( erişim belirteçleri ve türetme beceresi ),
bence eski C programları( code ) ile sadece sentax açısından uyumluluk için yapılmış birşey bu..

class ın farkı, varsayılan-olarak private kuralı..
OO programlama , class sözcüğü ve information-hiding kavramları sloganlaştırılmış olduğu için ,belki C++ prestij için bunlara ihtiyaç duydu..
bence eğer fonksiyonlar varsayılan olarak virtual tanımlanmış olsaydı , class-struct ayrımı daha anlamlı olurdu..

Euclides
18/07/2005, 20:47
C deki struct yapısı , pascaldaki record gibi, sadece veritipi tanımlıyordu...
nesne yönelimli programlama için değildi..

Hayıri, structlar fonskiyonda içerebilir tıpkı class'lar gibi....
önceki mesajımda da dediğim gibi bir değişiklik yapmadan bir class'ı struct haline getirebilirsiniz...


class ın farkı, varsayılan-olarak private kuralı..

hayır struct'lar private öğeler içerebilir...
private ve public onlar içinde tanımlı kelimelerdir...

carslan
18/07/2005, 20:50
Bu tamamiyle geliştiriciye kalmış durum. Geliştirici(software developer ve/veya software designer) hem class hem de struct için + lar ve - ler teraziye konur ona göre bir yapılandırma seçilir. Ancak Aşağıdaki gözardı edilmemesi gereken birkaç nokta var.

1)struct value type dır belirli durumlarda stack de aynı üyeler tekrarlanır bu da performansı etkiler
2)struct da Inheritance(kalıtım) desteklenmez
3)struct da parametik constructorlar yoktur çünkü default const vardır.

Euclides
18/07/2005, 21:13
1)struct value type dır belirli durumlarda stack de aynı üyeler tekrarlanır bu da performansı etkiler

Muahhaahah :D
tamam atında bu kadarını beklemiyordum doğrusu...

mr1yh1
18/07/2005, 21:37
Hayıri, structlar fonskiyonda içerebilir tıpkı class'lar gibi....
önceki mesajımda da dediğim gibi bir değişiklik yapmadan bir class'ı struct haline getirebilirsiniz...


hayır struct'lar private öğeler içerebilir...
private ve public onlar içinde tanımlı kelimelerdir...

euclides , projeni C projesi olarak aç, ve söylediklerini bir dene :) ..
C projelerinde public, private sözcükleri ; struct içerisindeki fonksiyonlar ; struct arasında türetme olamaz..

ama C deki struct yapısı C++ daki ile tam uyumludur..
yani C++ projelerinde eski C kodu içerisindeki struct lar nesne yönelimli olarak kullanılabilir.

@carslan
söylediğin yapı C# da var,
C++,kullanıcı tanımlı veri tipleri için stack veya heap zorlaması yok..
bunların run-time karşılıkları için ( objeler ) , programcı stack veya heap de yaratmayı seçebilir..

Euclides
18/07/2005, 21:54
euclides , projeni C projesi olarak aç, ve söylediklerini bir dene :) ..
C projelerinde public, private sözcükleri ; struct içerisindeki fonksiyonlar ; struct arasında türetme olamaz..

ama C deki struct yapısı C++ daki ile tam uyumludur..
yani C++ projelerinde eski C kodu içerisindeki struct lar nesne yönelimli olarak kullanılabilir.

Zaten c++'dan bahsediyoruz....
neden C ile deneyeyim ????????

soruma bir daha bakmanı öneririm !

carslan
18/07/2005, 22:11
Muahhaahah :D
tamam atında bu kadarını beklemiyordum doğrusu...


Neyi beklemiyordun??struct ın value type olduğunumu?

Euclides
18/07/2005, 22:13
Hyr nasıl olupta bu kadar uzak atabildiğini (!)
Hadi atacaksan orantılı at bari...

carslan
18/07/2005, 22:30
Hyr nasıl olupta bu kadar uzak atabildiğini (!)
Hadi atacaksan orantılı at bari...

hala anlamış değilim biraz daha açıklarmısın.

carslan
18/07/2005, 22:32
@carslan
söylediğin yapı C# da var,
C++,kullanıcı tanımlı veri tipleri için stack veya heap zorlaması yok..
bunların run-time karşılıkları için ( objeler ) , programcı stack veya heap de yaratmayı seçebilir..


Bu söylediğin sadece 1nci madde için geçerli tahmin ediyorum diğer maddeler için ne düşünüyorsun? Bu arada aslında bu tartışma çok yerinde değil bence bunun için ayrı bir yerde tartışılması gerekiyor. Bildiğim kadarıyla C# da daha fazla farklılık var.

ceeyt
18/07/2005, 22:36
siniflarda uye fonksiyonlar ve veriler varsayılan olarak 'private', yapilarda publictir. Sanırım kalitim da ayni sekilde yani birsey yazmazsak sinifta private, yapida public turer.

Tercih sebebi midir bu? o da ayri bir soru :) :)

sckz
18/07/2005, 23:57
doğru benim bildiğim, c++ ta, class ile struct arasındaki tek fark; class içinde üyelerinin varsayılan durumda private, struct ta ise üyeler varsayılan olarak public...

c deki durumu bilmiyorum..

ama aslında istediğim şeyler tam olarak bunlar değil.. tekrar soruyorum :
sınıf nedir? obje nedir? bunların veritipi ile bağlantısı nedir?

mr1yh1
19/07/2005, 02:21
built-in tipler için:
bir verinin tipi belirsiz ise, bilgisayar için sadece bit- yığınıdır..
mesela 65 .. ascii kodu da olabilir, integer de olabilir, bool da olabilir..onun nasıl depolanacağı ve nasıl işleneceği ( üzerinde yapılabilcek işlemler ) veri tipi tarafından belirlenir..

ikinci adım kullanıcı tanımlı veri tipleri,
pascal daki record, C deki struct gibi..
bunların iki amacı var,
--veriyi paketlemek..
--pascal da anlamlı olan sub-typing ..
ki programcıya derleme zamanında daha çok kontrol sağlıyor..mesela bir pascal programcısı ay diye bir veri tipi tanımlarsa ise bu 1 ile 12 arasında bir tamsayı olur. 13 değeri alamaz.. ( C de ise sadece typedef var..)

programlama veri-yönelimli hale geldikçe, veritipi kavramı genişlemiş, veriyi işleyen fonksiyonlar veri ile birlikte paketlenmiş ( package kavramı ADA dilinde var tam da bu işi yapıyor..) ve veriye erişim belirteçleri eklenmiş..
bunlar veri üzerinde çalışma güvenliği sağlamak için gerekli..

bunun ötesinde :
bir kod yazılıp bitirildikten sonra tamdır. (closed)
ve clients onu kullanabilir.
ama aslında kod hiçbir zaman tam değildir yeniliklere değişik durumlara uydurulması gerekir.( open)
türetme kavramı, varolan kodu değiştirmeden değişiklikler yapabilme şansı veriyor.. (open-closed)
class yapısı, veri tipinin üzerine bu olanağı da eklemiş oluyor..

değişkenler ve veri tipleri arasındaki bağlantı
objeler ve sınıf yapısı arasında var..
her sınıf aynı zamanda bir veri-yapısıdır, class yapısı geçmişteki yapılara eklemeler ile elde edilmiş..
ama sınıf kavramına başlıbaşına teorik destek ADT ( abstract data type ) ile veriliyor..
http://en.wikipedia.org/wiki/Abstract_data_type

atg
19/07/2005, 05:59
şimdi zehirli soruyu sorma zamanı geldi...

class ile yapılabilecek herşey tıpa tıp aynı şekilde(hiçbir fazlalık olmadan) struct ile de yapılabildiğinde göre neden class'a ihtiyaç duyulur ? neden kullanılır ?

Bulmuşsun acemileri dalga geçiyorsun.

Sabahi
19/07/2005, 07:01
C' den C++ a terimlerin cevirisi.
C ------------------------> C++ (OOP)

User-defined type --------> Class

Structure member --------> Instance Variable

Function -----------------> Method

Variable------------------> Object

Function Call-------------> Message

Yapilarin cevirisi.

A) C Structure

typedef struct{
int x,y;
}dortgen;

B) C++ Structure

struct dortgen{
int x,y;
};

C) C++ Class

class dortgen{
public:
int x,y;
};


A=B=C

Virtual function cevirisi.

C++

#include <iostream.h>

class hesap{
public:
int d;
void sakla(int i);
virtual int carp(int i);
};

void hesap::sakla(int i)
{
d=i;
}

int hesap::carp(int i)
{
return d*i;
}

void main()
{
hesap c;

c.sakla(25);
cout<<c.d<<endl;

cout<<c.carp(17)<<endl;
}

C

#include <stdio.h>

typedef struct{
int d;
int (**vp)();
}hesap;

void hesap_sakla(hesap *this, int i)
{
this->d = i;
}

int hesap_carp(hesap *this, int i)
{
return this->d*i;
}

int (*hesap_vtbl[1])() =
{
(int(*)())hesap_carp
};


void main()
{
int s;
hesap c;
c.vp = hesap_vtbl;
hesap_sakla(&c,25);
printf("%i\n", c.d);

s = (*((int(*)())(c.vp[0])))(&c,17);

printf("%i\n", s);
}

Yorumsuz.

neolion
23/07/2005, 06:03
Sinifin uyelerinin private olarak tanimlanmasi, ve bunlara ulasimi saglayan uye fonksiyonlari yazilmasi neden??

neden public yapmiyoruz??

mr1yh1
23/07/2005, 07:33
public yaptığın herşey , kodu kullanana sunulmuştur,
yani değiştirebilir..

class kisi
{
float idealKilo;
public:
float agirlik;
float boy;
float getIdealKilo(){ return foo( agirlik, boy ); }
}


burada birinin ideal kiloya ulaşıp onu değiştirmesini istemediğimiz için yada hazır olmayan bir veriye ulaşmasını istemediğimiz için private yaptık..ama agirlik ve boyu değiştirebilir..
bazıları agirlik ve boy içinde fonksiyon tanımlıyor.
çünkü ileride public olan bu değişkenlere ulaşımı sınırlamak istersen ( tasarım değişirse ) kod üzerinde çok değişiklik yapman gerekir..( senin kodu kullananlarında yapması gerekir...)

bunun bir nedeni C/C++ da argumansız fonksiyonun ve değşkenin sentaxının farklı olması..
mesela eiffel dilinde
x = idealKilo;
gibi bir ifadede idealKilo nun bir fonksiyon mu
yoksa değişken mi olduğunu bilemezsin..
bu yüzden programcı tasarımı değişirse problem çıkmaz..

mr1yh1
23/07/2005, 12:19
yukarıdaki kod dizayn olarak iyi olmadı, umarım kafa karıştırmaz..idealKilo sınıfın fonksiyonları tarafından kullanılabilir ama şu an gereksiz duruyor...

bruce eckel kitabında:
nesne yönelimli dizaynın birincil hedefi ,
kodun ileride değişebilecek kısımları ile,
sabit kalacak kısımlarını birbirinden ayırmakdır diyor

clients ( kodun kullanıcıları ) sadece public olan kısma güvenir ( başka da bir şansları yok) .
bu şekilde kodun diğer kısımda yapılabilecek değişiklikler onları etkilemez.

acehreli
25/07/2005, 16:28
carslan, soyledigin diger maddeler de yanlis. Baskalarinin da dedigi gibi, C++'ta struct ile class'in farki, varsayilan erisimlerinin birincisinde 'public', ikincisinde 'private' olmasidir.

sckz, aralarindaki bir diger fark, kalitim sirasinda 'struct'larin 'public' olarak turemesi, 'class'larin ise 'private' olarak turemesidir:


struct S{};
class C{};

struct YeniYapi : S, C
{};

class YeniSinif : S, C
{};


YeniYapi ve YeniSinif yukarida oldugu gibi erisim anahtar sozcukleri yazilmadan turetildiklerinde su yazimla aynidirlar:


struct YeniYapi: public S, public C
{};

class YeniSinif: private S, private C
{};


Sabahi, C++'ta serbest islevlere "free function", oge islevlere de "member function" denir. "Method" baska dillerde kullaniliyor olabilir.

Variable'in karsiligi C++'ta da variable'dir.

Lutfen artik <iostream.h> basligini kullanmayalim. O, standardin kullanimindan yillar once ortaya cikmis deneysel bir basliktir.

Eger ogeleri genel erisime acik (public) olacaksa, 'hesap'i struct olarak yazmani oneririm. Boylece amacini daha iyi aciklamis olur.

'void main' yasal degildir, 'int main' olmasi gerekir. (Simdi supheye dustum :) C# da yaziyor olabilirsin.)

neolion, genel erisime acik oldugu zaman, "invariant"larin yani ogeler arasinda bulunmasi gereken iliskilerin her zaman icin var oldugunu saglayamazsin. Ornegin eni, boyu, ve herhangi bir nedenden dolayi alani tutulan bir dortgenin eninin veya boyunun degistiginde alaninin da degismesini istersin. Ogeleri ozel yaptigin zaman, butun bu iliskileri oge islevler icerisinde saglayabilirsin. Genele actigin zaman ise, isteyen birisi ornegin enini degistirdiginde alanini degistirmeyebilir.

Ayrica, cogu ornekte gordugun ve sordugun gibi, ogeleri ozel yapip sonra da onlara dogrudan erisim saglayan oge islevler de ancak kucuk bir miktar iyidirler. Cunku ogeyi bir anlamda genel erisime acmis olurlar ama yine de bizim islevimizden gecirdikleri icin denetimi biraz olsun elimizde tutmamizi saglarlar.

Ali

Sabahi
26/07/2005, 05:40
@acehreli

Sabahi, C++'ta serbest islevlere "free function", oge islevlere de "member function" denir. "Method" baska dillerde kullaniliyor olabilir.

Oncelikle C++ safkan nesnel bir dil olmadigi halde nesnel programlama ozellikleri tasiyan melez bir dil oldugu icin bu soylediginiz sadece Nesneye Yonelik C++ icin dogru denilebilir. Denilebilir diyorum cunki eger internette "C++ Methods" benzeri bir arama yaparsaniz eminim "Method" teriminin yerinde kullanilip kullanilmadigina kendiniz karar verebilirsiniz.

Variable'in karsiligi C++'ta da variable'dir
Tekrar C++ diye bir genelleme yapmaktan kacinarak C++ ile (OOP) diye vurguladiktan sonra bir soru ile devam edelim ve diyelim ki

string degisken_string = "lagaluga"; diye bir variable acikladik. Eger bu ifadeyi dogru kabul ediyorsaniz akla su soru geliyor. Madem string bir non-primitive data type yada abstract data type (ADT) diyelim ve degisken_string aslinda bu ADT in bir instance i (es anlamli olarak object) o zaman bir C++ Object i variable olarak dusunmemize olan itiraz neden?

Lutfen artik <iostream.h> basligini kullanmayalim. O, standardin kullanimindan yillar once ortaya cikmis deneysel bir basliktir.

Bende yillar once programlamaya baslamis deneysel bir programciyim zaten, o yuzden olsa gerek pek severim:)

'void main' yasal degildir, 'int main' olmasi gerekir. (Simdi supheye dustum C# da yaziyor olabilirsin.)

Kanunen mi yasak yoksa? Neyse saka bir yana elestiriye acik bir insanim yalniz mumkunse sadece bu yasal degildir demek gibi bir takim iddialar yerine su nedenlerden dolayi bu tur bir uygulamanin su sakincalari vardir ve bu sekilde yapilmasi dogrudur gibi bir yaklasimi her zaman tercih ederim.
Bu arada benim gorusum void main() tamamen yasal bir ifade. Neden yasal olduguna gelince, ilk olarak bugune kadar hic bir C++ derleyicisi gormedim ki void main() ifadesine hata yada uyari mesaji versin (sizin bildiginiz varsa soyleyin bende bileyim). Eger gercekten dediginiz gibi yasal olmayan yada bir takim sakincalari olan bir kullanim olmus olsaydi eminim en azindan bir C++ derleyicisi bir uyari bari olsun verirdi.
Ikinci olarak main sadece programin giris noktasi ki canim isterse void CaniminIstedigiNokta() diye bir procedure yazardim ve derleyecimin bu procedure u giris noktasi olarak kullanmasini isterdim ve hic sikayet etmeden derlerdi.
Son olarak main return type in bilincli kullanimi gerektigi. Ornegin eger
int main()
{
....
return 1;
}
seklinde bir sey yazmis olsaydim buyuk bir ihtimalle return type ile ilgili bir sikayetiniz olmayacakti. Iyi ama acaba ne ise yarardi?
Bence main den value return yapmanin en buyuk yarari bir baska program yada script ile cagrildiginda donus degerine gore program in hatali sonlanip sonlanmadigini tesbit edebilmek. Bunun disindaki yararlarini ve aksi haldeki zararlarini sizden dinleyim artik.

mr1yh1
26/07/2005, 09:16
@sabahi
bu main fonksiyonunun durumu çok ilginç..

Issuing a return statement from the main function is equivalent to calling the exit function with the return value as its argument.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccelng/htm/basic_27.asp
msdn diyorki :
return değeri ile main den dönmek , exit fonksiyonunu bu değerle çağırmaya eşdeğerdir..
peki exit fonksiyonunu ne ile çağırabiliriz ?
void exit ( int status ) olarak stdlib de tanımlı..

gcc void main e izin vermiyor..
visualC++ veriyor ve diyorki : main fonsiyonundan 0 değeri ile çıktık ( exited )
ama main birşey döndürmüyordu, tanımı gereği ,
nasıl yaptık peki bunu... ( exit e return değerini aktarma )
burada işi dolanbaçlı hale getirmek ( exit fonksiyonunu varsayılan değer olarak 0 ile çağırdık ) demek bence biraz kafa karıştırıcı... üstelik void main () de return zaten olamaz...exit doğrudan çağırılmalı bu durumda..

ama işin tuhafı standart C++ da bunu yapıyor..
yani int main() fonksiyonun sonuna return eklemek zorunda değiliz ???...
( otomatik olarak return 0; gibi değerlendiriliyor..)
mantıksal olarak al birini vur ötekine...

ayrıca makinaya pC++ ye daha yakın bir arkadaş aşağıdaki yorumu açıklarsa çok faydalı olabilir..
Çünkü burada void main in stack i çökertebileceği !! iddia ediliyor..
http://users.aber.ac.uk/auj/voidmain.shtml

sckz
26/07/2005, 09:50
Denilebilir diyorum cunki eger internette "C++ Methods" benzeri bir arama yaparsaniz eminim "Method" teriminin yerinde kullanilip kullanilmadigina kendiniz karar verebilirsiniz.
Bi kitabımda (C++ Gotchas) bunun la ilgili şeyler yazıyordu : (alıntı Türkçe cevirisinden) :

Tuzak 9 : Kötü dil kullanma
C++'ın dışında kalan dünya birkaç yıl önce C++'ın ayrılıkçı dünyasını istila edince, bazı kınanacak derecede kötü dil ve kodlama uygulamalarını birlikte getirdiler.
.....
C++'ta "metot" yoktur. Java ve Smalltalk dillerinin metotları vardır. Nesne yönelimli tasarımla ilgili konuşuyorsanız ve kendinizi gösterişçi hissediyorsanız, "mesaj" ve "metot" terimlerini kullanabilirsiniz, fakat tasarımınıza ait bir C++ uygulamasını tartışırken, "fonksiyon çağrısı" ve "üye fonksiyon" terimlerini kullanın..
...


Bunlar muhtemelen herkes hertelden bişi söylemesin diye düzenlemek amacıyla konmuş kurallar..

Variable'in karsiligi C++'ta da variable'dir
o zaman bir C++ Object i variable olarak dusunmemize olan itiraz neden?Burda itiraz yok zaten.. sadece c++ taki durumun da aynı olduğu söyleniyor...

bir de main ile ilgili gcc nin verdiği hata :
voidmain1.cpp : 5 : error: `main' must return `int'
voidmain1.cpp : 5 : error: return type for `main' changed to `int'


iostream.h ile ilgili msvc 7 direk böyle bir dosyanın olmadığını söylerken, gcc sevinelim diye uyarı da veriyor :
#warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <sstream> instead of the deprecated header <strstream.h>.

acehreli
26/07/2005, 13:23
Sabahi, main adli ozel islevin int dOndUrdugunu C ve C++ standartlari soylerler. O ilev oyle tanimlanmistir... Standarda uygun olabilmesi icin C ve C++ programlarinin main'i int dondurecek sekilde yazmalari gerekir.

'void main'in en ilginc ozelliklerinden birisi, kisinin anlattiklari dilleri iyi bilmeyen kitaplardan ve ogretmenlerden yararlanarak gelistigini gostermesidir.

Ali

HunTER
26/07/2005, 13:31
Bu tartısmanın pratıkte yararı nedır? "Sınıf nedir? Obje nedir? Bunların veritipi ile bağlantısı nedir?" sorularını yanıtladıktan sonra netur bır aydınlanma yasıycaz?

mr1yh1
26/07/2005, 13:58
aslında olay "bunlar nedir ?"," aralarındaki fark nedir ?" den öte :
"bunlar neden var ?" "ne için insanlar bunları geliştirmiş ?"..
"yazılım işindeki kişiler hangi problemlerle karşılaşmışlar ki bu araçlara ihtiyaç duymuşlar ?"..
"C varken neden C++ ya ihtiyaç duymuşlar ?"

ya da mesela:
--neden bina yaparken kolon ve kiriş kullanılıyor ?
ben kullanmasam ne olur ? ( geçmişte birileri mutlaka ki bunu denedi ..)

--tek katlı bir ev yapacaksam ne yapmam lazım ?
sonradan kat çıkacaksam ne olacak ?

--prefabrik konutlar için malzeme üreteceksem, tek bir ev yapıyormuşum gibi mi dizayn yapmam lazım ?

sckz
26/07/2005, 14:06
ya da bi araba üretçek isek tekerlek yerine direksiyon u takmamak için veritipi farkını bilmemiz gerek..

sonra sınıfların veritipi ile baglantısını bilirsek, onların gizemli bişi olmadığını anlarız.. ya da encapsulation denilen olayı anlamıs oluruz.. vs vs..

aslında cok sey yazılabilir ama beni aşar..

mr1yh1
26/07/2005, 14:24
qbasic zamanında goto ile kavga edenler vardı..
dynamic typing, static typing kavgaları..
strongly-typing, weakly-typing kavgaları..
pure-OO yada mixed ( hem prosedürel hem OO ya izin veren diller ) kavgası..
garbage-collector gerekli midir kavgası..
design patterns ile ilgili ilk öğrendiklerim beni çok şaşırtmıştı mesela.. vahiy almış gibiydim.. :rolleyes:
şu aralar java daki checked-exception olayının yanlışlığı üzerine birşeyler okuyorum..

bu sadece pratikte ne elde ederim olayı da değil benim için..
sonuçta profesyonel programcı değilim..
steve jobs un bilgisayar için bir benzetmesi "bicycles for mind" varmış..
benim aklım bisiklete binmeyi seviyor. , roman okumaktansa bilgisayarla ilgili bir kitaplar okumayı tercih ederiyorum..

Sabahi
27/07/2005, 09:09
@acehreli
Stroustrup a gore hem ISO C++ standard 3.6.1[2] hemde ISO C standard 5.1.2.2.1 ile uyumlu uygulama int main() {/*...*/}. Ancak bu C++ standard icin dogru olmakla beraber C standart hali hazirda void main() i gecerli sayar. Bu nedenden dolayida mesela MS Visual C/C++ MSDN den bakabilirsin
http://msdn.microsoft.com./library/default.asp?url=/library/en-us/vclang98/HTML/_pluslang_program_startup.3a_.the_main_function.as p
void main() gecerli bir uygulamadir. Bir cok C/C++ kitabindaki void main() li orneklerin temelindede aslinda bu yatar ogretmenlerinin yetersizlikleri degil.

Arkantos
27/07/2005, 13:10
şimdi zehirli soruyu sorma zamanı geldi...

class ile yapılabilecek herşey tıpa tıp aynı şekilde(hiçbir fazlalık olmadan) struct ile de yapılabildiğinde göre neden class'a ihtiyaç duyulur ? neden kullanılır ?

Biraz konu eskimiş ama ilginç bir soru.. C++ ile sınıflar ile yapılan kodlar C ile struct kullanarak yapılabiliyormu ?

Örneğin :


#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()
{

Merdiven (8, 4);
return 0;
}

örnek programımız bu olsun. Bunu struct kullanarak C ile yapın. Bir örnek daha yazacam.. Örneğin sarma (encapsulation) kullanarak bir programı daha küçük ve başka birimlere ihtiyaç duymayan birimlere ayırabiliyoruz. Veri gizleme (data hiding) ile uygulamanın ayrıntılarını bilmesi gerekmyen sistemdeki diğer nesnelerden gizliyoruz. Böylece sarma ile büyük programların tasarımını kolaylaştırırken, veri gizleme ile daha güçlü yapıyoruz.

Bunlar C ile yapılabiliyor mu :confused:

@Sabahi: Hem C hem de C++ için yasal kullanım main'in dönüş türünü int kullanmaktır. Bunu zaten sen de söylemişsin.IDE olarak MS VC++6 kullanıyorsan pek tavsiye etmem. Programları yazarken çakılabilir :)

Bunun yerine standartlarla daha uyumlu olan VC++.NET 2003 kullanmanı tavsiye ederim. Ya da VC++ Toolkit ile gelen vc++ 7.1 derleyicisi olabilir..

acehreli
27/07/2005, 19:57
Sabahi, VC++'i veya MSDN'i dilin tanimi icin kullanmak yanlis olur. VC++'in da diger butun derleyiciler gibi hatalari oldugu bilinir. VC++'in 'void main'e izin vermesi de cok bilinen bir uyumsuzlugudur.

Dilin tanimi icin derleyicilere guvenecek olsak, bu sefer baska birisi de gcc'nin 'void main'in standart olmadigini gosterdigini soyleyebilir. Boyle bir sonuca varamayiz.

C'de de hicbir zaman 'void main' olmamistir. C'nin ilk tanimi olan Kernighan ve Ritchie'nin kitabinda bile, main basinda donus turu olmadan 'main' olarak yazilir. Onlarin tanimladiklari eski C'de donus turleri bildirilmeyen islevlerin 'int' dondurdukleri varsayildigi icin, basinda hicbir sey yazilmayan main'in de int dondurdugu anlasilir.

[Aslinda bunlari yazmama da gerek yok herhalde, cunku sen de ISO C standardindan alinti yaparak orada 'int main' oldugunu soyluyorsun.]

Ali

acehreli
27/07/2005, 20:01
Arkantos, bence Euclides "C varken C++'a ne gerek var" demiyor. Soyle diyor: "C++'ta struct ile class ayni seyleri yapabildigine gore, neden class diye yeni bir anahtar sozcuk gelmis?"

Cunku struct'larin icine ilk is olarak private koyma gibi bir kurala uyarak yine sarmadan (encapsulation) yararlanabilirmisiz:


struct SarilmisKavram
{
private:
/* ayni bir sinif gibi iste */
};


Ali

Sabahi
28/07/2005, 08:09
@acehreli

Biraz kisir bir tartisma haline geldi ve biraz daha uzarsa okuyanlar void main in fanatik bir savunucusu oldugumu zannedecekler. Aslinda butun istedigim bir kac noktanin altini cizmekti hepsi o. Birincisi daha oncede soyledigim gibi bir elestiri yapildiginda bu yanlis boyle yapilmaz demek pek yarari olmayan bir yaklasim. Ornegin dogrusu int main() der birakirsaniz sadece -1 bir integer bende return -1; dersem dogru mu yapmis olurdum?
Ikinci olarak ister dogru ister yanlis ister begenelim ister begenmiyelim C standard ina gore sonuclari tanimsiz olmakla birlikte void main() mumkun. Asagidaki linke bir goz atarsaniz ne demek istedigim daha iyi anlasilabilir belki .
http://homepages.tesco.net/~J.deBoynePollard/FGA/legality-of-void-main.html
Son olarak, her ne kadar bu ifadenin yasal oldugunu savunsamda ve zaman zaman tembellik yapip bir satir fazla yazmamak icin test amacli yazilmis kucuk programlarda kullansamda daha mantikli olanin int main() oldugunda hemfikirim.

@mr1ry1

Oncelikle gcc nin void main() e hata verdigini bilmiyordum bilgi icin tesekkurler. Ve
RISC OS ile ilgili yaziya bir goz attim. RISC OS ile pek bir hasir nesirligim olmadigi icin yazilanlarin tamamen dogru oldugunu kabul edecegim. Yalniz eger int main() kullansam bile eger return 257; demis olsam bu sistem yine cokecekti yani bu sistemin ayakta kalmasini garantilemek icin char main() diye bisi icat etmek lazim galiba. Yada her ne kadar return type int olsa bile basari icin 0 hata icin de 1 disinda bir sey donmenin tanimsiz oldugunu eklemek lazim aciklamalara.

mr1yh1
28/07/2005, 08:43
....
Yada her ne kadar return type int olsa bile basari icin 0 hata icin de 1 disinda bir sey donmenin tanimsiz oldugunu eklemek lazim aciklamalara.
bu konu benimde kafamı karıştırdı, sadece 0 ve 1 i kullanılabilirmiş gibi ifadeler gördüm , oysa bunlar sadece önceden anlamlandırılmış olanlar sanırım
( 0 ise herşey normal, 1 ise problem var..)
oysa return 3 yazsanda program "terminated with return code 3" sonucunu veriyor.. ( mesela dosya açma hatası varsa ve 3 gönderirsem hata takibi yapabilirim..)
zaten program içerisinden exit ile çıkmak ya da return ile çıkmak tümüyle aynı olduğu için exit ile hata kodu döndürülebildiğine göre return ile de döndürülebilmeli..

seninde söylediğin gibi hata denetimi dışında biryerde kullanılacak birşey gibi görünmüyor bu yapı..
ama bu tür bir hata denetimi çok eski bir yöntem, bugün için bildiğin gibi exception handling mekanizmaları var çok kapsamlı hata denetimi imkanı veriyor..
--hatanın bulunduğu yerde ( kapsam da ) denetlenmesi zorunluluğu yok
( hata yeniden fırlatılabilir,
yeni bir hata kodu (pardon nesnesi :) ) fırlatılabilir,
ya da dokunulmaz , bir üst kapsamda işlenebilir... )

Euclides
28/07/2005, 11:41
Arkantos, bence Euclides "C varken C++'a ne gerek var" demiyor. Soyle diyor: "C++'ta struct ile class ayni seyleri yapabildigine gore, neden class diye yeni bir anahtar sozcuk gelmis?"
Ali
+1 :)

Arkantos
28/07/2005, 12:32
Arkantos, bence Euclides "C varken C++'a ne gerek var" demiyor. Soyle diyor: "C++'ta struct ile class ayni seyleri yapabildigine gore, neden class diye yeni bir anahtar sozcuk gelmis?"


Yok bende Euclides'in böyle bir şey kasdettiğini düşünmedim. Ama benim merak ettiğim C struct yapıları ile C++ sınıfları ile yapılabilen her şey yapılabiliyor mu? Bu örneği de onun için verdim. (Bunu da gerçekten bilmediğim için soruyorum çünkü C bilmiyorum)

Tamam private kullanarak veri gizleme yapabiliyoruz. Peki gömülü nesneler kullanabilir miydik? Ya da ben has-a (içerme) ve is-a (türünden olma) ilişkilerini sadece structlarla yapabilirmiyiz? Benim anlatmaya çalıştığım buydu. Belki bu yukardaki örnek çok iyi seçilmemiş olabilir.

Ya da diyelim ki bir araba sınıfından türettiğimiz bir ferrari ve anadol nesnelerimiz var. Bunların ortak özellikleri olacak her ikisi de araba sonuçta. Örneğin her ikisinin de kaputu olacak :) Bir yarış oyunu programı yazıyoruz ve ferrari'nin çalıştırma şekli bir düğmeye basarak olacak, anadolunki kontağa basarak olacak. Ayrıca her ikisi de gaz pedalına basınca hızlanacak ama bunların hızlanma davranışları farklı olacak. Örneğin Ferrari 2 sn'de 100 km'ye çıkarken, Anadol 20 sn'de çıkacak. Yani demek istediğim ya çokbiçimlilik, kalıtım ;)

Bunları da C ile yapabilirmiyiz .. Ve sonuç olarak kalıtımı, nesneler arasındaki ilişkileri ve çokbiçimliliği struct veri yapıları ile gerçekleştiremediğimiz için sınıflara ihtiyaç duyulmuş diye düşündüm.

mr1yh1
28/07/2005, 13:42
....
Ama benim merak ettiğim C struct yapıları ile C++ sınıfları ile yapılabilen her şey yapılabiliyor mu? ...

C struct ları fonksiyon içeremez ( metodlar ),
private public gibi erişim belirteçleri kullanamazsın..
türetme yapamazsın..

nilsonmandela
28/07/2005, 15:31
Henüz yeni bir tane konu açtığım için bir yenisini daha açmak istemedim bu yüzden buraya yazıyorum.Bağlı listeler hakkında bilgi verebilecek arkadaşlar varmı acaba?Ne şekilde , nerelerde ve nelerin yerine kullanılır vs gibi.Şimdiden tşkrler.

RaiST
28/07/2005, 18:43
howto tadında yabancı bir kaynak:
http://www.digressed.net/howto/lists/ (grafiksel bir acıklama iceriyor)

ayrıca uzun zaman once bu foruma post atmıstık bu konuyla ilgili
(hernekadar kodlar vasat olsada en azından baslangıcta anlamana yeterli olacaktır)

http://forum.ceviz.net/showthread.php?t=1175&highlight=linked+list
http://forum.ceviz.net/showthread.php?t=1342&highlight=linked+list

acehreli
29/07/2005, 21:18
Arkantos, ben hAlA ayni sey hakkinda konusmadigimizi dusunuyorum, cunku C dilinden degil C++ dilinden bahsediyoruz.

Oncelikle senin sordugun sorunun yaniti: Hayir, C'de struct'lar kullanarak veri gizleme, kalitim vs. yapamayiz.

Ama C++ icinde struct kullanarak class ile yapabildigimiz herseyi (herseyi) yapabiliriz. Bu konu icinde daha yukarilarda struct ile class'in iki farkini konusmustuk. (Ogelerinin varsayilan erisimleri ve kalitim sirasinda varsayilan erisimleri.)

Ali

Arkantos
30/07/2005, 01:35
Arkantos, ben hAlA ayni sey hakkinda konusmadigimizi dusunuyorum, cunku C dilinden degil C++ dilinden bahsediyoruz.

Oncelikle senin sordugun sorunun yaniti: Hayir, C'de struct'lar kullanarak veri gizleme, kalitim vs. yapamayiz.

Ama C++ icinde struct kullanarak class ile yapabildigimiz herseyi (herseyi) yapabiliriz.
Ali

Tamam şimdi anladım olayı .. Siz de benim soruyu yanlış anladığımı anlamışsınız :D

Tekrardan önceki sayfadaki yazılanları dikkatle bi okuyayim bakim :)