Şuana kadar farklı sınıfları hep aynı dosyanın içine yazıp öyle çalıştırdık. Fakat bu ölçeklenebilir bir davranış değil. Onbinlerce yüzbinlerce satır kodun tek bir dosyada olması sıkıntılı bir durum. Bu sebeple bunları ayrı dosyaların içine nasıl yazabileceğimizi göstereceğiz.
Şimdi main.cpp de şöyle bir kodumuz olsun:
#include <iostream>
#include <string>
using namespace std;
class Person {
string name;
string surname;
int age;
int64_t ID;
public:
Person() {
name = "";
surname = "";
age = 0;
ID = 0;
}
Person(string name, string surname, int age, int64_t ID) {
this->name = name;
this->surname = surname;
this->age = age;
this->ID = ID;
}
string getInfoCard() {
string str{};
str += "Name: " + name + "\n"
+ "Surname: " + surname + "\n"
+ "Age: " + to_string(age) + "\n"
+ "ID: " + to_string(ID) + "\n";
return str;
}
};
int main() {
Person p;
cout << p.getInfoCard() << endl;
Person p2("hasan", "kara", 44, 123456789011);
cout << p2.getInfoCard() << endl;
}Person isminde bir sınıf oluşturduk sonra main() fonksiyonunda 2 adet obje oluşturup kullandık. Şimdi Solution Explorer üzerinden projemize sağ tık->add -> new class diyerek yeni sınıf ekliyoruz.


Yukarıdaki kodu yapıştırmışsanız “projenizde hali hazırda böyle bir sınıf var” diye hata verecektir. Person sınıfını /* yorum içine alarak */ bu hatayı önleyebilirsiniz.

İki tane yeni dosyamız geldi. Bunlardan biri .h öteki ise .cpp
- .h dosyasına header file
- .cpp dosyasına implementation file diyoruz.
Şimdi main.cpp deki sınıfımızı person.h dosyasına aktaralım:
// Person.h
#pragma once
#include <string>
class Person {
std::string name;
std::string surname;
int age;
int64_t ID;
public:
Person() {
name = "";
surname = "";
age = 0;
ID = 0;
}
Person(std::string name, std::string surname, int age, int64_t ID) {
this->name = name;
this->surname = surname;
this->age = age;
this->ID = ID;
}
std::string getInfoCard() {
std::string str{};
str += "Name: " + name + "\n"
+ "Surname: " + surname + "\n"
+ "Age: " + std::to_string(age) + "\n"
+ "ID: " + std::to_string(ID) + "\n";
return str;
}
};// main.cpp
#include <iostream>
#include "Person.h"
using namespace std;
int main() {
Person p;
cout << p.getInfoCard() << endl;
Person p2("hasan", "kara", 44, 123456789011);
cout << p2.getInfoCard() << endl;
}Çok bir değişiklik yapmadık:
- Person sınıfını olduğu gibi .h içine taşıdık.
- Sınıfta ihtiyaç duyulan #include <string> ‘i de taşıdık.
- using namespace std; yi sildik. Silmesek de olurdu fakat daha temiz olması için bu şekilde yaptım.
- En son olarak main.cpp içine include “Person.h” yazdık. Böylece mainde person sınıfına erişebileceğiz.
- .h dosyasının en başında #pragma once ifadesi bulunmakta. Bu dosyamızın birden fazla kez include olmasını önlemek için kullanılıyor.
Şimdi olayı bir tık ileri götürüp fonksiyonlarımız sınıftan ayıralım:
#pragma once
#include <string>
class Person {
std::string name;
std::string surname;
int age;
int64_t ID;
public:
Person();
Person(std::string name, std::string surname, int age, int64_t ID);
std::string getInfoCard();
};
Person::Person() {
name = "";
surname = "";
age = 0;
ID = 0;
}
Person::Person(std::string name, std::string surname, int age, int64_t ID) {
this->name = name;
this->surname = surname;
this->age = age;
this->ID = ID;
}
std::string Person::getInfoCard() {
std::string str{};
str += "Name: " + name + "\n"
+ "Surname: " + surname + "\n"
+ "Age: " + std::to_string(age) + "\n"
+ "ID: " + std::to_string(ID) + "\n";
return str;
}Gördüğünüz gibi function declaration ‘lar sınıf içindeyken. Definition ‘lar sınıf dışına alındı. Bunu yaparken fonksiyonun isminin başına Person:: getirmemiz yeterli. Bu ek o fonksiyonun o sınıfa ait olduğunu gösteriyor.
Daha da ileri giderken function definition ‘ları person.cpp dosyasına alabiliriz:
// Person.h
#pragma once
#include <string>
class Person {
std::string name;
std::string surname;
int age;
int64_t ID;
public:
Person();
Person(std::string name, std::string surname, int age, int64_t ID);
std::string getInfoCard();
};
// Person.cpp
#include "Person.h"
Person::Person() {
name = "";
surname = "";
age = 0;
ID = 0;
}
Person::Person(std::string name, std::string surname, int age, int64_t ID) {
this->name = name;
this->surname = surname;
this->age = age;
this->ID = ID;
}
std::string Person::getInfoCard() {
std::string str{};
str += "Name: " + name + "\n"
+ "Surname: " + surname + "\n"
+ "Age: " + std::to_string(age) + "\n"
+ "ID: " + std::to_string(ID) + "\n";
return str;
}// main.cpp
#include <iostream>
#include "Person.h"
using namespace std;
int main() {
Person p;
cout << p.getInfoCard() << endl;
Person p2("hasan", "kara", 44, 123456789011);
cout << p2.getInfoCard() << endl;
}Kodumuzun son hali yukarıdaki gibidir. Sonuç olarak main.cpp üzerine yığılmış kodları farklı dosyalara dağıttık ve böylece programımız okunaklığını artırmış olduk.
pragma once
Programımız derlenirken .h dosyaları derlenmez ama .cpp dosyaları derlenir. Peki .h dosyalarında yazan kodlar ne oluyor?
#include “Person.h” yaptığımızda person.h dosyasının tüm içeriği .cpp dosyasına kopyalanıyor ve daha sonrasında .cpp dosyası derleniyor.
Kopyalama işleminin birden fazla kez olmasını engellemek için pragma once kulanıyoruz. Pragma once deyiminden sonra yazılanlar sadece bir kere include ediliyor.
Pragma once ‘a benzer ikinci bir yapı ise include guard tır:
#ifndef PHYSICS_H
#define PHYSICS_H
// sınıf kodları
#endif // PHYSICS_H
Leave a Reply