Commit 86e920c4 by Szeberényi Imre

PKomplex

parent 22fa8509
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="PKomplex" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/PKomplex" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Debug/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
</Compiler>
</Target>
<Target title="Release">
<Option output="bin/Release/PKomplex" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Release/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-O2" />
</Compiler>
<Linker>
<Add option="-s" />
</Linker>
</Target>
</Build>
<Compiler>
<Add option="-pedantic" />
<Add option="-std=c++11" />
<Add option="-Wall" />
</Compiler>
<Unit filename="komplex.h" />
<Unit filename="pkomplex.cpp" />
<Unit filename="pkomplex.h" />
<Unit filename="pkomplex_main.cpp" />
<Unit filename="serializable.h" />
<Extensions>
<code_completion />
<envvars />
<debugger />
<lib_finder disable_auto="1" />
</Extensions>
</Project>
</CodeBlocks_project_file>
/**
* \file pkomplex.h
*
*/
#ifndef KOMPLEX_H
#define KOMPLEX_H
#include <math.h>
/**
* Komplex osztály.
* Komplex viselkedést megvalósító osztály.
* Csak a feladat megoldásához szükséges műveleteket definiáltuk.
*/
class Komplex {
double re; // valós rész
double im; // képzetes rész
public:
Komplex() { re = 0; im = 0; } // paraméter nélküli konstruktor
Komplex(double r, double i = 0) { re = r; im = i; } // 1 és 2 paraméteres konstruktor
// setter függvények
void setRe(double d) { re = d; }
void setIm(double i) { im = i; }
// getter függvények
double getRe() const { return re; }
double getIm() const { return im; }
// abs
double abs() const { return sqrt(re*re+im*im); }
virtual ~Komplex() {}
};
#endif // KOMPLEX_H
/**
* \file pkomplex.cpp
*
*/
#include "pkomplex.h"
void PKomplex::write(std::ostream& os) const {
os << getRe() << "," << getIm() << std::endl;
}
void PKomplex::read(std::istream& is) {
double tmp;
(is >> tmp).ignore(1);
setRe(tmp);
(is >> tmp).ignore(1);
setIm(tmp);
}
/**
* \file pkomplex.h
*
*/
#ifndef PKOMPLEX_H
#define PKOMPLEX_H
#include "serializable.h"
#include "komplex.h"
class PKomplex : public Serializable, public Komplex {
public:
//Kostruktorok: Minden kell, ami a komplexnek van
// paraméter nélküli konstruktor
PKomplex() : Komplex() {}
// 1 és 2 paraméteres konstruktor
PKomplex(double r, double i = 0) : Komplex(r, i) {}
// + egy olyan ami Komplex-ből hoz létre
PKomplex(const Komplex& k) : Komplex(k) {}
// setter/getter függvények (jönnek a publikus öröklésből)
// másoló op=, nem kell mert nem kezelünk din. területet
// read/write kell
void write(std::ostream&) const;
void read(std::istream&);
};
#endif // PKOMPLEX_H
/**
* \file pkomplex_main.cpp
*
*/
#include <iostream>
#include <fstream>
#include "pkomplex.h"
using std::cout;
using std::endl;
int main() {
std::ofstream f1("f1.dat");
PKomplex k1(3, 4), k2;
// lustaságból csak az abszolút értéket írjuk ki:
cout << "k1.abs():" << k1.abs() << endl;
cout << "k2.abs():" << k2.abs() << endl;
// kiírjuk
k1.write(f1);
f1.close();
std::ifstream f2("f1.dat");
// visszaolvassuk
k2.read(f2);
f2.close();
cout << "k2.abs():" << k2.abs() << endl;
// konverziók:
// PKomplex -> komplex (kompatibilitás biztosítja)
Komplex k0 = k2;
cout << "k0.abs():" << k0.abs() << endl;
// Komplex -> Pkomplex (konstruktor biztosítja)
PKomplex kk = k0;
cout << "kk.abs():" << kk.abs() << endl;
// most próbáljunk egy tömböt kiírni és visszaolvasni.
PKomplex t1[5];
t1[0] = Komplex(3, 4);
t1[1] = Komplex(6, 8);
t1[2] = Komplex(5, 12);
f1.open("f1.dat");
for (int i = 0; i < 5; i++)
t1[i].write(f1);
PKomplex t2[5];
f2.open("f1.dat");
for (int i = 0; i < 5; i++)
t2[i].read(f2);
for (int i = 0; i < 5; i++)
cout << "t2[" << i << "].abs():" << t2[i].abs() << endl;
return 0;
}
/**
* \file serializable.h
*
*/
#ifndef SERIALIZABLE_H
#define SERIALIZABLE_H
#include <iostream>
struct Serializable {
virtual void write(std::ostream& os) const = 0; // kiíró
virtual void read(std::istream& is) = 0; // beolvasó
virtual ~Serializable() {} // ne legyen probléma az upcast
};
#endif
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
#ifndef IRODA_H #ifndef IRODA_H
#define IRODA_H #define IRODA_H
//#define VIRT_OROKLESSEL #define VIRT_OROKLESSEL
#ifdef VIRT_OROKLESSEL #ifdef VIRT_OROKLESSEL
#define VIRTUAL virtual #define VIRTUAL virtual
......
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="polimorf" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/virt_destruktor" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Debug/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
</Compiler>
</Target>
<Target title="Release">
<Option output="bin/Release/virt_destruktor" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Release/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-O2" />
</Compiler>
<Linker>
<Add option="-s" />
</Linker>
</Target>
</Build>
<Compiler>
<Add option="-Wall" />
<Add option="-fexceptions" />
</Compiler>
<Unit filename="polimorf.cpp" />
<Extensions>
<code_completion />
<envvars />
<debugger />
<lib_finder disable_auto="1" />
</Extensions>
</Project>
</CodeBlocks_project_file>
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* \file polimorf.cpp * \file polimorf.cpp
* *
* Többszörös öröklés és a polimorf viselkedés, * Többszörös öröklés és a polimorf viselkedés,
* valamint a dynamic_cast memutatása. * valamint a dynamic_cast bemutatása.
* *
* A dynamic_cast-hoz fontos, hogy a fordításkor legyen * A dynamic_cast-hoz fontos, hogy a fordításkor legyen
* engedélyezve a Run-Time Type Info (RTTI) generálása * engedélyezve a Run-Time Type Info (RTTI) generálása
...@@ -14,27 +14,31 @@ ...@@ -14,27 +14,31 @@
#include <iostream> #include <iostream>
#include <stdexcept> #include <stdexcept>
using namespace std; /// Utasítást kiíró és végrehajtó makró
#define _(x) std::cout << #x << std::endl; x
using std::cout;
using std::endl;
/// A osztáy. /// A osztáy.
/// (struct: mindene publikus) /// (struct: mindene publikus)
struct A { struct A {
void f() { cout << " A::f()\n"; } void f() { cout << "\t A::f()\n"; }
void f(int) { cout << " A::f(int)\n"; } void f(int) { cout << "\t A::f(int)\n"; }
virtual ~A() {} // csak ezért virt., hogy legyen RTTI infó virtual ~A() {} // csak ezért virt., hogy legyen RTTI infó
}; };
/// B osztáy. /// B osztáy.
/// (struct: mindene publikus) /// (struct: mindene publikus)
struct B { struct B {
void f(double) { cout << " B::f(double)\n"; }; void f(double) { cout << "\t B::f(double)\n"; };
}; };
/// C osztáy. /// C osztáy.
/// (struct: mindene publikus) /// (struct: mindene publikus)
struct C { struct C {
void f(int*) { cout << " C::f(int*)\n"; }; void f(int*) { cout << "\t C::f(int*)\n"; };
}; };
/// AB osztáy. /// AB osztáy.
...@@ -46,7 +50,7 @@ public: ...@@ -46,7 +50,7 @@ public:
using A::f; // Így elérhetõk az A-beli f()-ek using A::f; // Így elérhetõk az A-beli f()-ek
using B::f; // Így elérhető a B-beli f()is using B::f; // Így elérhető a B-beli f()is
void f() { void f() {
cout << " AB::f()\n"; cout << "\t AB::f()\n";
A::f(); A::f();
f(1); // A::f(int) f(1); // A::f(int)
f(1.2); // B::f(double) f(1.2); // B::f(double)
...@@ -57,36 +61,37 @@ public: ...@@ -57,36 +61,37 @@ public:
int main() { int main() {
AB ab; AB ab;
cout << "Fuggvenyek [ab.A::f(), ab.f(int) ab.f(doube) ab.f()]" << endl; cout << "Fuggvenyek probaja:" << endl;
ab.A::f(); _( ab.A::f(); )
ab.f(5); // A::f(int) _( ab.f(5); ) // A::f(int)
ab.f(6.3); // B::f(double) _( ab.f(6.3); ) // B::f(double)
ab.f(); // AB::f() _( ab.f(); ) // AB::f()
A *Ap = &ab; // az upcast automaiikus cout << endl << "Upcast-nak mennie kell:" << endl;
B *Bp = &ab; // az upcast automaiikus _( A *Ap = &ab; ) // az upcast automaiikus
_( B *Bp = &ab; ) // az upcast automaiikus
cout << endl << "Pointerek konvertalasa:" << endl; cout << endl << "Pointerek konvertalasa:" << endl;
AB *ABp = dynamic_cast<AB*>(Ap); // biztonságos down cast _( AB *ABp = dynamic_cast<AB*>(Ap); ) // biztonságos down cast
if (ABp != 0) { if (ABp != 0) {
cout << "Sikeres volt a down cast" << endl; cout << "Sikeres volt a down cast" << endl;
ABp->f(); _( ABp->f(); )
} else { } else {
cout << "A down cast nem sikerult" << endl; cout << "A down cast nem sikerult" << endl;
} }
C *Cp = dynamic_cast<C*>(Ap); // ez nem fog menni _( C *Cp = dynamic_cast<C*>(Ap); ) // ez nem fog menni
if (Cp == 0) cout << "AB* nem konvertalhato C*-ra" << endl; if (Cp == 0) cout << "AB* nem konvertalhato C*-ra" << endl;
cout << endl << "Referencia konvertalasa:" << endl; cout << endl << "Referencia konvertalasa:" << endl;
// Referencia konvertálásánál a hibajelzés kivétellel jön // Referencia konvertálásánál a hibajelzés kivétellel jön
try { try {
AB& ab2 = dynamic_cast<AB&>(*Ap); _( AB& ab2 = dynamic_cast<AB&>(*Ap);)
cout << "Sikeres volt a down cast referenciara is:" << endl; cout << "Sikeres volt a down cast referenciara is:" << endl;
ab2.f(); _( ab2.f(); )
cout << "Kiserlet C referenciara valo konvertziora:" << endl; cout << "Kiserlet C referenciara valo konvertziora:" << endl;
C& c2 = dynamic_cast<C&>(*Ap); _( C& c2 = dynamic_cast<C&>(*Ap);)
} catch (exception& e) { } catch (std::exception& e) {
cout << e.what() << endl; cout << e.what() << endl;
} }
return 0; return 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment