Yapılandırılmış Bağlamalar
Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 88 / 104.
C++17 ile kullanıma sunulan yapılandırılmış bağlamalar, tek bir bildirimde dizilerden, ikililerden, demetlerden veya yapıtlardan birden fazla değeri ayrı adlandırılmış değişkenlere açmanıza olanak tanır. Bu, bileşik verilerle çalışırken kodu daha temiz ve okunabilir hâle getirir.
Sözdizimi, yeni değişken adlarını içeren köşeli parantezlerle birlikte auto kullanır:
#include <iostream>
#include <map>
#include <tuple>
int main() {
// Bir pair'i açma
std::pair<std::string, int> person{"Alice", 25};
auto [name, age] = person;
std::cout << name << " is " << age << "\n";
// Bir tuple'ı açma
std::tuple<int, double, char> data{42, 3.14, 'X'};
auto [num, pi, letter] = data;
// Aralık tabanlı for döngülerinde açma
std::map<std::string, int> scores{{"Bob", 90}, {"Carol", 85}};
for (const auto& [student, score] : scores) {
std::cout << student << ": " << score << "\n";
}
}Yapılandırılmış bağlamalar, herkese açık üyelere sahip diziler ve özel yapılarla da çalışır:
struct Point {
double x;
double y;
};
Point getOrigin() { return {0.0, 0.0}; }
int main() {
auto [x, y] = getOrigin();
int arr[3] = {1, 2, 3};
auto [a, b, c] = arr;
}Kopyaları önleyerek ve gerektiğinde özgün değerlerin değiştirilmesine olanak tanıyarak referansla bağlamak için auto& veya const auto& kullanabilirsiniz. Bu özellik, özellikle STL kapsayıcıları üzerinde yineleme yaparken veya birden çok değer döndüren işlevleri işlerken kullanışlıdır.
Görev
KolayYapılandırılmış bağlamaların gücünü sergileyen bir öğrenci notu analizörü oluşturalım. Öğrenci kayıtlarını ve ders verilerini işleyen, kodunuz boyunca çiftleri, demetleri ve struct'ları zarif bir şekilde açmak için yapılandırılmış bağlamaları kullanan bir sistem oluşturacaksınız.
Kodunuzu üç dosyaya ayıracaksınız:
Student.h: Öğrencinin adı (Student), kimliği (std::string) ve GPA'sı (int) için public üyeleri olan birdoublestruct'ı tanımlayın. Ayrıca ad, kimlik ve GPA alan ve bircreateStudentstruct'ı döndürenStudentadlı bir işlev oluşturun.GradeUtils.h: Not işleme için yardımcı işlevler oluşturun.Sayısal bir puan (tamsayı) alan ve üç değer içeren bir
getGradeInfodöndürenstd::tupleadlı bir işlev tanımlayın: harf notu (std::string), not puanı (double) ve geçip geçmediği (bool). Bu not ölçeğini kullanın:- 90+ : "A", 4.0, true
- 80-89: "B", 3.0, true
- 70-79: "C", 2.0, true
- 60-69: "D", 1.0, true
- 60'ın altı: "F", 0.0, false
Ayrıca bir ders adı (
makeScorePair) ve puan (std::string) alan ve bu değerlerden oluşan birintdöndürenstd::pairadlı bir işlev tanımlayın.main.cpp: Dört girdi okuyun:- Öğrenci adı (string)
- Öğrenci kimliği (tamsayı)
- Ders adı (string)
- Puan (tamsayı)
main işleviniz boyunca yapılandırılmış bağlamaları kullanın:
createStudentişlevini ad, kimlik ve 0.0 yer tutucu GPA değeriyle çağırın. Döndürülen struct'ı tek tek değişkenlere açmak için yapılandırılmış bağlamaları kullanın, ardından şunu yazdırın:Student: [name] (ID: [id])makeScorePairişlevini ders adı ve puanla çağırın. Çifti açmak için yapılandırılmış bağlamaları kullanın, ardından şunu yazdırın:Course: [course], Score: [score]getGradeInfoişlevini puanla çağırın. Demetin üç öğesini de açmak için yapılandırılmış bağlamaları kullanın, ardından şunu yazdırın:(geçme durumu true ise "yes", false ise "no" yazdırın)Grade: [letter] Points: [points] Passing: [yes/no]
Örneğin, girdiler Alice, 1001, Math ve 85 olduğunda:
Student: Alice (ID: 1001)
Course: Math, Score: 85
Grade: B
Points: 3
Passing: yesGirdiler Bob, 2002, Physics ve 55 olduğunda:
Student: Bob (ID: 2002)
Course: Physics, Score: 55
Grade: F
Points: 0
Passing: noGereken yerlerde <tuple> ve <utility> eklemeyi unutmayın. Temel çıkarım şudur: yapılandırılmış bağlamalar, bileşik türleri, çiftleri, demetleri ve struct'ları tek ve okunabilir bir bildirimde adlandırılmış değişkenlere açmanıza olanak tanır.
Kendin dene
#include <iostream>
#include <string>
#include "Student.h"
#include "GradeUtils.h"
int main() {
// Girdileri oku
std::string studentName;
int studentId;
std::string courseName;
int score;
std::cin >> studentName;
std::cin >> studentId;
std::cin >> courseName;
std::cin >> score;
// TODO: createStudent'ı name, id ve yer tutucu GPA 0.0 ile çağır
// Struct'ı açmak için structured bindings kullan: auto [name, id, gpa] = ...
// Yazdır: Student: [name] (ID: [id])
// TODO: makeScorePair'i course name ve score ile çağır
// Pair'i açmak için structured bindings kullan: auto [course, sc] = ...
// Yazdır: Course: [course], Score: [score]
// TODO: getGradeInfo'yu score ile çağır
// Tuple'ı açmak için structured bindings kullan: auto [letter, points, passing] = ...
// Yazdır:
// Grade: [letter]
// Points: [points]
// Passing: [yes/no] (passing true ise "yes", false ise "no" yazdır)
return 0;
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarC++ Build ve DerlemeBaşlık Dosyaları ve Kaynak DosyalarıAd Alanları ve KapsamC++'ta OOP'ye GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriÖzet - Basit Hesap Makinesi4Sınıf Özellikleri
Örnek ve Statik ÜyelerGetter ve Setter MetotlarıConst Üye FonksiyonlarMutable Anahtar KelimesiStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim SeviyeleriCtor ve Dtor Çağrılma SırasıMetot Geçersiz KılmaSanal Fonksiyonlar ve VTableÇoklu KalıtımSanal KalıtımÖzet - Çalışan Hiyerarşisi10STL Genel Bakış
STL Genel Bakış ve FelsefesiSTL KonteynerleriİteratörlerSTL AlgoritmalarıFunctor'lar ve Lambda İfadeleriÖzet - Kelime Frekansı13Tasarım Kalıpları 1. Bölüm
Tasarım Kalıplarına GirişSingleton KalıbıFactory ve Abstract FactoryBuilder KalıbıObserver KalıbıStrategy Kalıbı2Bellek Yönetimi
Stack ve Heap Bellekİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++'ta Akıllı İşaretçilerC++'ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'da Erişim BelirleyicilerDerinlemesine Erişim BelirleyicilerBilgi GizlemeStruct vs Classİç İçe ve Dahili SınıflarÖzet - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDynamic Casting ve RTTIÖzet - Şekil Hesaplayıcı3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopya YapıcıTaşıma YapıcısıYapıcı İlklendirme ListeleriTemsilci YapıcılarYıkıcılara Derinlemesine BakışÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatör Aşırı YüklemeKarşılaştırma Operatörü Aşırı YüklemeStream OperatörleriAtama Operatörü Aşırı Yükleme[] ve () Operatör Aşırı YüklemeTip Dönüşüm OperatörleriÖzet - Matris Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeVariadic ŞablonlarSFINAE ve Type Traits TemelleriÖzet - Generic Konteyner12Modern C++ Özellikleri
Taşıma Semantiği ve R-değerleriMükemmel YönlendirmeDerinlemesine Lambda İfadeleristd::function ve std::bindconstexpr ve constevalYapılandırılmış Bağlamalaroptional, variant, anyKendi başına pratik yap: Online C++ derleyicisi