byanigli
Hectopat
Daha fazla
- Cinsiyet
- Erkek
- Meslek
- student of software engineering
Merhabalar, bugün sizlerle c++ programlara dillinde swap taktiklerinden bahsedip, template konusu tartışacağız.
İlk senaryomuz elimizde iki değişken olsun ve bunları yer değiştirmek isteyelim.
İlk yönetimimiz bu olabilirdi ama, bu yöntem çok masraflıdır. Örnekte görüldüğü sadece int tipindeki verileri swap ediyoruz. String veya float tipinde birşeyler gönderseydik eğer, hata alacaktık ve her veri tipi için bir fonksiyon tanımlayacaktık. Halbu ki her tanımladığımız fonksiyon aynı işi yapmaktadır.
2. Yöntem void pointer.
Üstte gördüğümüz kod blogundaki gibi bir mekanizma kullanılabiliriz ama bu yöntemde görüldüğü gibi veri tipleri belli değil. Sadece değerleri gösteren pointera, bir pointer tanımlıyoruz, ve onların yerlerini değiştiriyoruz.
3. Ortak base class ve polimorfik yaklaşım
Üstte gördüğümüz yöntem ise birinci değişkeni, ikinci değişkenle değiştirebiliriz ama bu yöntemde güvenli bir yöntem değildir. Runtime'da veri tipi kontrolu yapıyor olsada, complier time 'da her hangi bir veri tipi kontrolu yapmamaktadır.
3. Yöntem C macro tanımlanması
İlk senaryomuz elimizde iki değişken olsun ve bunları yer değiştirmek isteyelim.
Kod:
void swap(int *r, int *s)
{
int *pSwap = r;
r = s;
s = pSwap;
return;
}
int main()
{
int p = 7;
int q = 9;
swap(&p, &q);
cout << "p = " << p << "q= " << q << endl;
return 0;
}
Altıntı...
İlk yönetimimiz bu olabilirdi ama, bu yöntem çok masraflıdır. Örnekte görüldüğü sadece int tipindeki verileri swap ediyoruz. String veya float tipinde birşeyler gönderseydik eğer, hata alacaktık ve her veri tipi için bir fonksiyon tanımlayacaktık. Halbu ki her tanımladığımız fonksiyon aynı işi yapmaktadır.
2. Yöntem void pointer.
Kod:
#include <iostream>
using namespace std;
void mySwap(void **pA,void **pB)
{
void *pC = *pA;
*pA = *pB;
*pB = pC;
}
int main ()
{
float fA = 5;
float fB = 19;
cout<<fA<<"and"<<fB <<endl;
mySwap((void**)&fA,(void**)&fB);
cout<<fA<<"and"<<fB;
string fs = "aas";
string fa = "abc";
cout<<fs<<"and"<<fa<<endl;
mySwap((void**)&fs,(void**)&fa);
cout<<fs<<"and"<<fa;
return 0;
}
3. Ortak base class ve polimorfik yaklaşım
Kod:
#include <iostream>
using namespace std;
class Base{
public:
virtual void Sswap(Base& other){};
};
class A :public Base
{
public:
A(int a){_a= a;}
int setA(int a){_a=a;};
int getA(){return _a;};
void Sswap(Base& other)
{
A& _A = dynamic_cast<A&>(other);
int _temp = _a;
_a= _A.getA();
}
private:
int _a;
};
void my_swap(Base& obj1, Base& obj2)
{
obj1.Sswap(obj2);
}
int main()
{
A a1(1);
A a2(2);
cout<< "a1: " << a1.getA()<<" "<< "a2: "<<a2.getA()<< endl;
my_swap(a1,a2);
cout<<"a1: " << a1.getA()<<" "<< "a2: "<< a2.getA()<< endl;
}
Üstte gördüğümüz yöntem ise birinci değişkeni, ikinci değişkenle değiştirebiliriz ama bu yöntemde güvenli bir yöntem değildir. Runtime'da veri tipi kontrolu yapıyor olsada, complier time 'da her hangi bir veri tipi kontrolu yapmamaktadır.
3. Yöntem C macro tanımlanması
Kod:
#include <iostream>
#define my_swap(type, i, j) {type T = i; i=j; j=T;}
using namespace std;
int main()
{
int a = 1;
int b = 2;
cout<< "a:" <<a<<" "<< "b: "<<b<< endl;
my_swap(int,a,b);
cout<<"a: " << a<<" "<< "b: "<< b<< endl;
}