Ebben a tananyagrészben arról lesz szó, hogyan daraboljunk fel egy osztályt több fájlra.
előző tananyagrész: osztályok/objektumok
következő tananyagrész: öröklődés és polimorfizmus
Amelyik fájlban szeretnénk használni az osztályt (pl. main.cpp) annak az elején szerepeljen:
#include "classname.h"
Az osztálydefiníciót helyezzük el egy osztalynev.h fájlba, mely fájl elejére írjuk ezt:
#ifndef CLASSNAME_H
#define CLASSNAME_H
Ez az úgynevezett include guard vagy header guard, ami arról gondoskodik, hogy többszöri includeolás esetén ne kapjunk fordítási hibát.
Az osztálydefiníción kívül definiált tagfüggvényeket pedig helyezzük el egy osztalynev.cpp fájlba, mely fájl elején szerepeljen:
#include "classname.h"
Ez a sor szintén szerepeljen azokban a fájlokban (pl. main.cpp) ahol szeretnénk használni az osztályt.
Új fájl hozzáadása fejlesztői környezetben
CodeBlocksban például így tudunk új fájlt hozzáadni. Aki szereti, választhatja a New Classt is, én azért nem szeretem, mert egy csomó fölösleges dolgot is hozzátesz.
Példa
A person.h fájl tartalma:
//person.h:
#include <iostream>
#include <string>
class person {
public:
//constructor declaration
person(std::string p_username, std::string p_fullname, int p_age);
//getter functions
std::string get_username() const { return username; }
std::string get_fullname() const { return fullname; }
int get_age() const { return age; }
std::string get_workplace() const { return workplace; }
void get_former_workplaces() const;
//setter functions
void set_workplace(const std::string& p_workplace);
//destructor
~person() {
delete[] former_workplaces;
}
private:
std::string username;
std::string fullname;
int age;
std::string workplace;
size_t fw_length = 1; //actual size
size_t fw_capacity = 1; //full size
std::string* former_workplaces = nullptr;
void former_workplaces_grow();
};
A person.cpp fájl tartalma:
//person.cpp
#include "person.h"
//constructor definition
person::person(std::string p_username, std::string p_fullname, int p_age) {
username = p_username;
fullname = p_fullname;
age = p_age;
//allocating dynamic array
former_workplaces = new std::string[fw_length]{};
}
void person::get_former_workplaces() const {
for (int i = 0; i < fw_capacity; ++i) {
std::cout << former_workplaces[i] << '\n';
}
}
void person::former_workplaces_grow() {
if (fw_capacity == fw_length) {
//grow size
fw_capacity *= 2;
//allocate backup array
std::string* former_workplaces_backup = new std::string[fw_capacity];
//copy elements to backup array
for (int i = 0; i < fw_length; ++i) {
former_workplaces_backup[i] = former_workplaces[i];
}
//delete original array
delete[] former_workplaces;
//assign the backup array to original array
former_workplaces = former_workplaces_backup;
}
}
void person::set_workplace(const std::string& p_workplace) {
//we don't need to save the empty string
if (workplace == "") {
workplace = p_workplace;
return;
}
//check if we need a bigger array
former_workplaces_grow();
//save the old workplace
former_workplaces[fw_length] = workplace;
++fw_length;
//set the new workplace
workplace = p_workplace;
}
A main.cpp fájl tartalma:
//main.cpp:
#include <iostream>
#include <string>
#include "person.h"
int main() {
person person1{"christo161", "Adam Kovacs", 30};
person1.set_workplace("BKV");
person1.set_workplace("BKK");
person1.set_workplace("FKF");
person1.set_workplace("MVM");
person1.set_workplace("Fotav");
std::cout << "Former workplaces of " << person1.get_fullname() << ":\n";
person1.get_former_workplaces();
}
Egyéb tananyagok:
előző tananyagrész: osztályok/objektumok
következő tananyagrész: öröklődés és polimorfizmus