C++ Şamataları

Başlatan muhittin_kaplan, 28 Nisan 2014, 01:02:41

muhittin_kaplan

Hocalarım alınmayın kişisel değildir.

C++ öğrenmek istiyorum. bunu öğrenme isteğim PC de birşeyler yapmak değil, Gömülü sistemlere bu dille ile birşeyler yapmaktır.

Vs 2013 express edition u kurdum.

ve ilk class ımı yazdım.

MyClass.hpp
#define _USE_MATH_DEFINES

#include <math.h>


const float PI =3;
class Kure
{
    public:
        float r;
        float x, y, z;
        float hacim();
        float alan();
    
};


MyClass.cpp

#include "MyClass.hpp"

 
float Kure::hacim()
{
return (r*r*r*4*PI / 3);
};
float Kure::alan()
{
return (r * r * 4 * PI);
};


main.ccp

#include <iostream>
#include "MyClass.hpp"
using namespace std;

int main()
{
	Kure k;
	k.r=1.0;
	k.x=2.0;
	k.y=3.0;
	k.z=4.0;
	cout << "Alan =" << k.alan() << "\n"<< "Hacim=" << k.hacim() << "\n";
	cin>>k.r;

return 0;

}

muhittin_kaplan

#1
C++ öğrenmek isteyenler için güzel bir yazı.
http://acehreli.org/turkcecpp/cpp_ogrenmek.html

mesaj birleştirme:: 28 Nisan 2014, 13:30:34

CoIde ile C++ da yazmak için

http://www.coocox.org/forum/images/ckeditorfiles/20131023205634_How_to_use_CPlusPlus_in_CoIDE.pdf

yamak

#2
Hocam bir tavsiyede bulunmak istedim.Belki siz de biliyosunuzdur fakat kullanmadığınız için söylüyorum.r,x,y,z değerlerini kuruc metod yardımıyla atarsanız daha şık durur.Örneğin;
#include <math.h>


const float PI =3;
class Kure
{
    public:
        Kure(float r1,float x1,float y1,float z1);
        float r;
        float x, y, z;
        float hacim();
        float alan();
    
};


#include "MyClass.hpp"

Kure::Kure(float r1,float x1,float y1,float z1)
{
   r=r1;
   x=x1;
   y=y1;
   z=z1;

}
float Kure::hacim()
{
return (r*r*r*4*PI / 3);
};
float Kure::alan()
{
return (r * r * 4 * PI);
};


Kullanımı:
#include <iostream>
#include "MyClass.hpp"
using namespace std;

int main()
{
    Kure k(1,2,3,4);
    cout << "Alan =" << k.alan() << "\n"<< "Hacim=" << k.hacim() << "\n";
    cin>>k.r;

return 0;

}

muhittin_kaplan

Hocam inline fonkisyon ile yukarda yazdığımız gibi ayrı HPP ce CPP lerde dosya oluşturmanın ne gibi faydası zararı var ?
Bir inline fonksiyonla alakalı örnek verirmisiniz ? Neden Bu Ayrıma gerek duyuyorum.

yamak

Hocam inline fonksiyonları hız gerektiren durumlarda kullanırız.Eğer fonksiyonun içeriğinde çok fazla kod yoksa ve hız gerektiren bir durum varsa inline fonksiyon kullanabilirsiniz.Örneğin lcd'ye 1 byte data ya da komut gönderen fonksiyonları inline yaparız ki fonksiyon her çağırıldığında program counter o fonksiyonun bulunduğu yere sıçramasın.Bu arada inline fonksiyonlar derleme esnasında derleyici tarafından her çağırıldığı yere kopyalanırlar.Yani fonksiyonu çağırdığınız yerde sanki fonksiyonun içeriğindeki tüm kodları yazmışsınız gibi olur.Böyle PC'nin dallanmasına gerek olmaz.
Umarım sorunuzu doğru anlamışımdır.

muhittin_kaplan

#5
Anladım Hocam teşekkür ederim.

mesaj birleştirme:: 28 Nisan 2014, 15:11:12

şimdi hocam, aşağıda clasın ve metodu aynı dosyada ve in line olarak oluşturduk (değil mi)
veri private olarak tanımlı bundan dolayı main den ulaşamam ama clas içerisinde ulaşabilirim. ben bu yapıyı HPP ve CPP olarak bölmek istesem nasıl veriye ulaşırım (bu haliyle taşımak hataya neden olur mu)
(set ve get metodları ile yapılabilir sanırım.)

CPP dosyası
class MyClass {
    int veri;
public:
    void MyClass(int data){
         veri=data;
          sdt::cout<<veri;
     }


MAIN

main(){
     MyClass Z;
      z.MyClass(3);


mesaj birleştirme:: 28 Nisan 2014, 15:17:36

https://www.google.com.tr/url?q=http://ninova.itu.edu.tr/tr/dersler/bilgisayar-bilisim-fakultesi/1250/blg-252/ekkaynaklar%3Fg120810&sa=U&ei=OkZeU6zxAu2h7AaFoYCgCA&ved=0CDYQFjAE&usg=AFQjCNEgLaNZ8QJVuiqzGWIsW4G8gZUxaA

Tagli

#6
Ben de C++'ı yeni yeni öğrendiğim için belki bana pek söz düşmez ama aklıma gelen bir iki yere değineyim dedim:

Inline fonksiyonlar genelde header dosyasının içindeki sınıf tanımlamasının içine doğrudan gömülürler. Bu yapıldığında inline ifadesini yazmaya gerek kalmaz, derleyici o fonksiyonu otomatik olarak inline kabul eder. Bunun faydası var mıdır, varsa nedir ben de bilmiyorum ama anladığım kadarıyla yaygın usul bu. Şöyle:
class Kure
{
    public:
        Kure(float r1,float x1,float y1,float z1);
        float r;
        float x, y, z;
        float hacim() { return (r*r*r*4*PI / 3); }
        float alan() { return (r * r * 4 * PI); }
};

Bu arada, genel olarak veriler private, arayüz fonksiyonları public olarak tanımlanır. Değişkenlere doğrudan erişim izni verilmez.

Header dosyalarına mutlaka Header Guard konulur. Böylece aynı dosyanın yanlışlıkla birden fazla kez eklenmesi engellenir.

Başlangıçta biraz kafa karıştırıcı olacak belki ama değinmeden geçmeyeyim, "bu da varmış" diye aklınızda kalsın: Constructor'larda üye değişkenlerin atanması genelde initializer list denilen bir yazım şekli ile yapılır. Bu örnekte herhangi bir fark yaratmasa da, sınıf içindeki referanslar gibi sonradan değişemeyecek verilerin atanması sadece bu yolla yapılabilmektedir. Ayrıca türetilmiş sınıflarda, ana (base) sınıfın constructor'ının çağrılması da bu şekilde yapılır. Şöyle:
Kure::Kure(float r1,float x1,float y1,float z1)
: r(r1), x(x1), y(y1), z(z1)
{
//Buraya bir şey yazmaya gerek kalmadı. 
}


Son olarak, verilen aşağıdaki çağırma şekli hatalı:
MyClass z;
z.MyClass(3);

Öncelikle, zaten ilk satır hatalı çünkü bu MyClass z(void) şeklini alır. Ama MyClass'a biz argüman alan bir constructor tanımlayarak, varsayılan argümansız constructor'ın derleyici tarafından oluşturulmasını engelledik. Varsayılanı da istiyorsak elimizle boş bir tane yazmamız lazım. Aslında bunun bir yolu daha vardı, derleyiciye "sen varsayılanı da yine de oluştur" diyebiliyorduk ama C++11'e özgü bir özellik olabilir belki, aklımda kalmamış.
Ekleme: Şimdi aklıma geldi, argümanlara varsayılan değerler atanarak da çözüm üretilebilir.
İkinci satır da hatalı. Nesne üzerinden constructor çağrılmaz. Ortada oluşmuş z diye bir nesne varsa constructor'ın zaten işi kalmamıştır.

Not: Yeni öğrenen biri olarak yazdıklarımda hatalar olabilir, affola.
Gökçe Tağlıoğlu

bocek

class Kure
{
    public:
        Kure(float r1,float x1,float y1,float z1);
        float r;
        float x, y, z;
        float hacim() = { return (r*r*r*4*PI / 3); } // burada = konulmayacak
        float alan() = { return (r * r * 4 * PI); } // // burada = konulmayacak
};

@tagli, fonksiyon tanımları class'ın içinden yapılırken '=' konur diye bir şey yok.

kurucu fonksiyonu parametre geçmeden default değerlerle oluşturmak istersek şöyle bir tane daha kurucu fonksiyon tanımlarız.

Kure ():r(1.0),x(0),y(0),z(0) {};

Nasılsa C++ 'ta "function overloading" diye bir şey var. Aynı isimde fakat farklı sayıda ve türde parametre alan fonksiyonlar olabiliyor.

Kure kure; // şu anda r=1, x=0, y=0, z=0 olan bir kure'miz var.
1 ya da 0. işte 'bit'ün mesele..

Tagli

Doğru, = olmayacak, dalgınlığıma gelmiş.
Gökçe Tağlıoğlu

muhittin_kaplan

#9
Mod Arkadaşlar  buranın adını C++ Şamataları Olarak Değiştiririse Sevinirim

muhittin_kaplan

Fonksiyon Aşırı tanımlanmasından şunumu anlamalıyım.

int fonksiyon(int x,int y){
     return Z
}

float fonksiyon(float x,float y, int t){
    return K
}

int main (){
   int A;
   A=fonksiyon (3,5); // ilk yazdığım fonksiyon çalışır

   float B;
   B=fonksiyon (3.0,5.0,93); // ikinci yazdığım fonksiyon çalışır
foksiyon isimleri aynı olmasına rağmen aldığı param durumuna göre fonksiyon çalışıyor. (iyiymiş, Gömülü sistemde Parametre alamayan altprogramlar yazmak zorunda kalan dillere bakarsak bu ballı kaymak.)


bocek

#11
dha asıl tadına varmadın muhittin_kaplan.
overloading sadece fonksiyonlarla da sınırlı değil. 'operator overloading' ile operatörlere de ekstra işlev yükleyebiliyorsun.

mesela elma ile armutu toplayabilirsin operator overloading ile.

ya da bir Kure'yi diğer bir Kure'ye "=" operatörü ile eşitleyebilirsin.
örneğin:
class Kure
{
    public:
        Kure(float r1,float x1,float y1,float z1);
        Kure& operator= (const Kure& kure)  // = operatörüne ekstra işlev yüklüyoruz.
         {
             r = kure.r;
             x = kure.x;
             y = kure.y;
             z = kure.z;
         };
        float r;
        float x, y, z;
        float hacim() { return (r*r*r*4*PI / 3); } 
        float alan() { return (r * r * 4 * PI); } 
};


artık şunu yazabiliriz.

Kure a,b;
a = b; // b'nin özelliklerini bizim yazdığımız fonksiyon aracılığıyla a'ya atadı.



mesaj birleştirme:: 29 Nisan 2014, 12:32:00

ya da iki küre eşit mi değil mi karşılaştırma operatörünü yazalım.
    bool Kure::operator== (const Kure& kure) { return ( r== kure.r && x== kure.x && y == kure.y && z == kure.z); };

fonksiyon tanımını class tanımı dışında bir yerde yaptığımızdan fonksiyonun başına Kure:: yazdık ki kimin nesidir belli olsun.
tabii bu durumda class tanımı içinde fonksiyonu deklare etmeyi unutmuyoruz.
class Kure {
....
bool operator== (const Kure&);
...
}




artık şunu yapabiliriz;
Kure a,b;
 ....
if (a == b) 
{
  ....
}

1 ya da 0. işte 'bit'ün mesele..

kantirici

elimizde bir class ın içnde yazılmış 2 fonksiyon olsun. Fonksiyonlar aşırı yükleme ile kullanılıyor.

fonksiyon(float x,float y, int t,int t3)

fonksiyon(float x,float y)


şimdi bir yerde  fonksiyon(float x,float y, int t ) şeklinde bir kullanım olabilir mi? Olursa 4 parametre alan fonksiyona giderse 4. parametre ne olur?


muhittin_kaplan

yapmak istediğin aslında 4 parametresi olan fonk. kullanmak ama 3 parametremi vereceksin ?

kantirici

hocam arduino da yazılmış bir kütüphanede gördüm. Fonksiyon A, 4 parametre alıyor fakat 3 parametre geçirilmiş. Bir diğer fonksiyon A ise 2 parametre alıyor.