[itk] Számítástechnika kezdőknek

C++ programozás kezdőknek - több forrásfájlból álló programok

[2022. február 09.] [ christo161 ]

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.

itk_cpp_new_emptyfile.pngitk_cpp_new_emptyfile2.pngitk_cpp_new_emptyfile3.pngitk_cpp_new_emptyfile4.png

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

A bejegyzés trackback címe:

https://itkezdoknek.blog.hu/api/trackback/id/tr5817342700

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása