Öröklés C++ módra
Dobra Gábor · 2022.03.25.
Öröklés C++ módra
A videó a jegyzet 7. fejezetéhez tartozik.
std::vector<Alakzat*> alakzatok; // közös tároló
alakzatok.push_back(new Teglalap(0xFF0000FF, Pont(1, 2), 4, 3));
alakzatok.push_back(new Kor(0x00FF00FF, Pont(3, 0), 2));
for (size_t i = 0; i < alakzatok.size(); ++i)
alakzatok[i]->rajzol();
for (size_t i = 0; i < alakzatok.size(); ++i)
delete alakzatok[i];
std::vector<Alakzat*> alakzatok;
alakzatok.push_back(new Teglalap(/* ... */));
alakzatok.push_back(new Kor(/* ... */));
try {
for (size_t i = 0; i < alakzatok.size(); ++i)
alakzatok[i]->rajzol();
} catch (...) {
for (size_t i = 0; i < alakzatok.size(); ++i)
delete alakzatok[i];
throw; // újradobjuk
}
for (size_t i = 0; i < alakzatok.size(); ++i)
delete alakzatok[i];
class Rajztabla {
std::vector<Alakzat*> alakzatok;
public:
void hozzaad(Alakzat* uj) { // dinamikusan foglalt
alakzatok.push_back(uj);
}
void rajzol() const {
for (size_t i = 0; i < alakzatok.size(); ++i)
alakzatok[i]->rajzol();
}
~Rajztabla() {
for (size_t i = 0; i < alakzatok.size(); ++i)
delete alakzatok[i];
}
};
class Rajztabla {
std::vector<Alakzat*> alakzatok;
Rajztabla(Rajztabla const&); // C++98: private
Rajztabla& operator=(Rajztabla const&);
public:
Rajztabla();
~Rajztabla();
};
class Rajztabla {
std::vector<Alakzat*> alakzatok;
public:
Rajztabla() = default; // C++11: default
Rajztabla(Rajztabla const&) = delete; // C++11
Rajztabla& operator=(Rajztabla const&) = delete;
~Rajztabla();
};
- downcasting-ra való
- általában nem a legjobb ötlet.
- csak olyan osztályokra működik, aminek van virtuális függvénye
class Rajztabla {
std::vector<Alakzat*> a;
public:
/* ... */
void set_szin(uint32_t szin) {
for (size_t i = 0; i < a.size(); ++i) {
TeliAlakzat* ta = dynamic_cast<TeliAlakzat*>(a[i]);
if (ta != nullptr)
ta->set_szin(szin);
}
}
};
class P {
Rajztabla r;
public:
P() {
r.hozzaad(new Teglalap(/* ... */));
r.hozzaad(new Kor(/* ... */));
r.hozzaad(new Kor(/* ... */));
}
void set_szin(uint32_t szin) {
for (int i = 0; i < static_cast<int>(r.meret()); ++i) {
TeliAlakzat* ta = static_cast<TeliAlakzat*>(r[i]);
ta->set_szin(szin);
}
}
};
#include <fstream>
- Ősosztályok: std::ostream, std::istream
- std::ofstream: output file stream
- std::ifstream: input file stream
std::ostream& operator<<(std::ostream& os, Pont const& p) {
os << '(' << p.x << ',' << p.y << ')';
return os;
}
int main() {
std::cout << Pont(1, 2);
std::ofstream of("ki.txt");
of << Pont(1, 2);
}
#include <sstream>
- std::istringstream
- std::ostringstream
- std::stringstream: std::istream és std::ostream!
std::ostream& operator<<(std::ostream& os, Pont const& p) {
os << '(' << p.x << ',' << p.y << ')';
return os;
}
int main() {
std::cout << Pont(1, 2);
std::ostringstream os;
os << Pont(1, 2);
std::cout << os.str() << std::endl; // (1, 2)
}
sormintagyanús
class Stack {
std::vector<double> adat; // adattag
public:
void push(double uj) {
adat.push_back(uj); // végére beszúr
}
void pop() {
adat.pop_back(); // végéről levesz
}
double& top() {
return adat.back(); // utolsó elem
}
double const& top() const {
return adat.back();
}
bool empty() const {
return adat.empty();
}
};
A stacket a vector felhasználásával implementáljuk.
class Stack : private std::vector<double> { // kifelé nem látszik
public:
void push(double const& uj) {
this->push_back(uj); // sajátként elérhető
}
void pop() {
this->pop_back();
}
double& top() {
return this->back();
}
double const& top() const {
return this->back();
}
using std::vector<double>::empty; // delegálás
};