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 @@
#ifndef IRODA_H
#define IRODA_H
//#define VIRT_OROKLESSEL
#define VIRT_OROKLESSEL
#ifdef VIRT_OROKLESSEL
#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 @@
* \file polimorf.cpp
*
* 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
* engedélyezve a Run-Time Type Info (RTTI) generálása
......@@ -14,27 +14,31 @@
#include <iostream>
#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.
/// (struct: mindene publikus)
struct A {
void f() { cout << " A::f()\n"; }
void f(int) { cout << " A::f(int)\n"; }
void f() { cout << "\t A::f()\n"; }
void f(int) { cout << "\t A::f(int)\n"; }
virtual ~A() {} // csak ezért virt., hogy legyen RTTI infó
};
/// B osztáy.
/// (struct: mindene publikus)
struct B {
void f(double) { cout << " B::f(double)\n"; };
void f(double) { cout << "\t B::f(double)\n"; };
};
/// C osztáy.
/// (struct: mindene publikus)
struct C {
void f(int*) { cout << " C::f(int*)\n"; };
void f(int*) { cout << "\t C::f(int*)\n"; };
};
/// AB osztáy.
......@@ -46,7 +50,7 @@ public:
using A::f; // Így elérhetõk az A-beli f()-ek
using B::f; // Így elérhető a B-beli f()is
void f() {
cout << " AB::f()\n";
cout << "\t AB::f()\n";
A::f();
f(1); // A::f(int)
f(1.2); // B::f(double)
......@@ -57,36 +61,37 @@ public:
int main() {
AB ab;
cout << "Fuggvenyek [ab.A::f(), ab.f(int) ab.f(doube) ab.f()]" << endl;
ab.A::f();
ab.f(5); // A::f(int)
ab.f(6.3); // B::f(double)
ab.f(); // AB::f()
cout << "Fuggvenyek probaja:" << endl;
_( ab.A::f(); )
_( ab.f(5); ) // A::f(int)
_( ab.f(6.3); ) // B::f(double)
_( ab.f(); ) // AB::f()
A *Ap = &ab; // az upcast automaiikus
B *Bp = &ab; // az upcast automaiikus
cout << endl << "Upcast-nak mennie kell:" << endl;
_( A *Ap = &ab; ) // az upcast automaiikus
_( B *Bp = &ab; ) // az upcast automaiikus
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) {
cout << "Sikeres volt a down cast" << endl;
ABp->f();
_( ABp->f(); )
} else {
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;
cout << endl << "Referencia konvertalasa:" << endl;
// Referencia konvertálásánál a hibajelzés kivétellel jön
try {
AB& ab2 = dynamic_cast<AB&>(*Ap);
_( AB& ab2 = dynamic_cast<AB&>(*Ap);)
cout << "Sikeres volt a down cast referenciara is:" << endl;
ab2.f();
_( ab2.f(); )
cout << "Kiserlet C referenciara valo konvertziora:" << endl;
C& c2 = dynamic_cast<C&>(*Ap);
} catch (exception& e) {
_( C& c2 = dynamic_cast<C&>(*Ap);)
} catch (std::exception& e) {
cout << e.what() << endl;
}
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