Yazılım Geliştirme: C++’da Konuya Bağlı Arama ve Gizli Arkadaş Dili

Adanali

Active member
Yazılım Geliştirme: C++’da Konuya Bağlı Arama ve Gizli Arkadaş Dili


  1. Yazılım Geliştirme: C++’da Konuya Bağlı Arama ve Gizli Arkadaş Dili

Bağımsız Değişkene Bağlı Arama (ADL), aynı zamanda Koenig Araması olarak da bilinir, işlev bağımsız değişkenlerine dayalı olarak nitelenmemiş işlevleri aramak için bir dizi “sihirli” kuraldır. Gizli Arkadaş Deyimi, Konuya Bağlı Aramaya (ADL) dayalıdır.







Rainer Grimm, uzun yıllardır yazılım mimarı, ekip lideri ve eğitim yöneticisi olarak çalışmaktadır. C++, Python ve Haskell programlama dilleri üzerine makaleler yazmaktan hoşlanır, aynı zamanda sık sık uzmanlık konferanslarında konuşmaktan da keyif alır. Modernes C++ blogunda yoğun bir şekilde C++ tutkusundan bahsediyor.













Konuya bağlı arama


çünkü çalışıyor”Hello World” plan ?


#include <iostream>

int main() {
std::cout << "Hello world";
}


Başka bir deyişle: program neden çalışmamalı? Aşırı yüklenmiş çıktı operatörü << içinde std-Ad alanı tanımlandı. Öyleyse soru, uygun aşırı yüklenmiş çıktı operatörünün nasıl bulunacağıdır. std::string? Cevap ADL’dir.

Wikipedia, ADL’nin güzel bir tanımını gösterir:


  • Konuya bağlı arama: C++ programlama dilinde, bağımsız değişkene bağlı arama (ADL) veya bağımsız değişkene bağlı ad arama, işlev çağrısına sağlanan bağımsız değişken türlerine bağlı olarak nitelenmemiş bir işlev adı bulmak için geçerlidir. Bu davranış, mucit olmamasına rağmen genellikle Andrew Koenig’e atfedildiği için Koenig’in araştırması olarak da bilinir.
İşte ADL’yi kullanmanın basit bir örneği:


// adl.cpp

namespace MyNamespace {
struct MyStruct {};
void function(MyStruct) {}
}

int main() {

MyNamespace::MyStruct obj;
function(obj); // (1)

}


Arama function(obj) (1)’de bağımsız değişkene bağlı arama olmadan başarısız olur. ADL sayesinde, nitelenmemiş işlev adları aranırken, nitelenmemiş adlar için normal aramaya ek olarak, bağımsız değişken ad alanı da dikkate alınır. Sonuç olarak, ad alanındaki işlevin adı MyNamespace kurmak.

Artık ADL’nin ne anlama geldiğini biliyoruz. Ancak bu yine de asıl sorunu çözmüyor. Çünkü basit”Hello World“-Plan?


#include <iostream>

int main() {
std::cout << "Hello world";
}


C++ Insights’ı deneyelim.


#include <iostream>

int main()
{
std::eek:perator<<(std::cout, "Hallo Welt"); // (1)
return 0;
}


Arama std::cout << "Hello World"; işlev çağrısına eşdeğerdir operator<<(std::cout, "Hallo Welt"); (1). ADL, bizim özel durumumuzda bağımsız değişkenlerinin ad alanını inceler. std::cout içerir.

Gizli arkadaş dili


Bağımsız Değişkene Bağlı Arama, bir sınıfın genel arabirimini genişletir: Üye olmayan işlevler veya işleçler, o sınıfın genel arabirimini genişletir. Şimdi gizli arkadaş deyimi devreye giriyor:

friend-Sınıf içinde tanımlanan işlevler veya işleçler iki özel özelliğe sahiptir:

  • Sınıfın özel üyelerine erişebilirsiniz.
  • Üye olmayan işlevler veya işleçlerdir.
İkinci nokta ise pek bilinmiyor ve C++ derslerimde düzenli olarak açıklamam gerekiyor. Sınıf içinde tanımlanan bir arkadaş işlevinin, işleç aşırı yüklemesi için ilginç etkileri vardır. friend-Sınıf içinde tanımlanan operatörler, sınıfın özel üyelerine erişebilir, üye olmayan işlevlerdir ve bağımsız değişkene bağlı arama ile bulunur.


// hiddenFriend.cpp

#include <iostream>

class MyDistance{
public:
explicit MyDistance(double i):m(i){}

friend MyDistance operator +(const MyDistance& a,
const MyDistance& b){ // (1)
return MyDistance(a.m + b.m);
}

friend MyDistance operator -(const MyDistance& a,
const MyDistance& b){ // (2)
return MyDistance(a.m - b.m);
}

friend std::eek:stream& operator<< (std::eek:stream &out,
const MyDistance& myDist){ // (3)
out << myDist.m << " m";
return out;
}

private:
double m;

};


int main() {

std::cout << 'n';

std::cout << "MyDistance(5.5) + MyDistance(5.5): "
<< MyDistance(5.5) + MyDistance(5.5) << 'n'; // (4)

std::cout << "MyDistance(5.5) - MyDistance(5.5): "
<< MyDistance(5.5) - MyDistance(5.5) << 'n'; // (5)

std::cout << 'n';

}


(1), (2) ve (3)’teki üç operatör de arkadaştır. Karşılık gelen operatörler + (4) e’de - (5)’te beklendiği gibi bulunur.

C++ Insights, operatörün aşırı yüklenmesinin büyüsünü bir kez daha gösteriyor.

Özellikle, (4)’teki ekleme (MyDistance(5.5) + MyDistance(5.5)) dönüştürülür: operator+(MyDistance(5.5), MyDistance(5.5)).

Son olarak programın çıktısı şu şekildedir:








aksine ben istiyorum friend-Aşırı yüklenen operatörün beyanı + ayırmak.


class MyDistance{
public:
explicit MyDistance(double i):m(i){}

MyDistance operator +(const MyDistance& a,
const MyDistance& b){
return MyDistance(a.m + b.m);
}

friend MyDistance operator -(const MyDistance& a,
const MyDistance& b){
return MyDistance(a.m - b.m);
}

friend std::eek:stream& operator<< (std::eek:stream &out,
const MyDistance& myDist){
out << myDist.m << " m";
return out;
}

private:
double m;

};


Şimdi programın derlenmesi başarısız oluyor:








İlk satırda derleyici, operatör tanımının + yalnızca sıfır veya bir bağımsız değişken olabilir (hiddenFriend:9:16). olmadan friend-bildirim operatördür + bir üye işlevi ve bu nedenle örtük bir işlevi vardır this– Işaretçi. Bunun anlamı, operatörün + toplamda üç konusu vardır. Sonuç olarak, derleyici uygun operatörü bulamıyor. + (Gizli arkadaş:32:75).

Sıradaki ne?


Hidden Friend Deyimine ek olarak, C++’da birçok başka sınıf tasarım deyimi vardır. Bir sonraki yazımda sıfır, beş ya da altı kuralı hakkında yazacağım.


(rm)



ana sayfaya
 
Üst