Commit 9e924854 by Szeberényi Imre

Teljesen új feladatok (2021 tavasz)

parent bad7f0eb
#
# Makefile pelda az alakzatlab (7. labor) megoldasanak forditasara
# gnumake valtozat
# Linuxokon es ural2-n is elerheto
#
#
PROG = alakzat_main # a program neve (ezt allitjuk elo)
# Rajzatablas valtozathoz torolje a kommentet a kovetkezo sorbol
#PROG = alakzat_main
PROG_O = $(PROG).o alakzat.o kor.o szakasz.o szin.o pont.o # program object fajljai
# Rajzatablas valtozathoz torolje a kommentet a kovetkezo sorbol
#PROG_O += rajtabla.o
PROG_H = alakzat.h kor.h szakasz.h ellipszis.h szin.h pont.h # program header fajljai
# Rajzatablas valtozathoz torolje a kommentet a kovetkezo sorbol
#PROG_H += rajtabla.h
PROG_L = # program libjei
MTRACE_O = memtrace.o # memtrace object fajl
MTRACE_H = memtrace.h # memtrace header fajlja
CXX = g++ # a C fordito neve
#CXX = clang++ # clang-ot (llvm) is erdemes kiprobalni
CXXFLAGS = -pedantic -Wall -DMEMTRACE #
CXXFLAGS += -g # es legyeb debug info is
LDFLAGS = -g # debug a linkelesnel
# osszes object, osszes header osszes lib
OBJS = $(PROG_O) $(MTRACE_O)
HEADS = $(PROG_H) $(MTRACE_H)
LIBS = $(PROG_L) $(MEMCHK_L)
# alapertelmezett cel: program
.PHONY: all
all: $(PROG)
$(PROG): $(OBJS)
$(CXX) $(LDFLAGS) $(OBJS) -o $@ $(LIBS)
# feltetelezzuk, hogy az osszes obj fugg az osszes headertol, ami nem feltetlenul igaz
$(OBJS): $(HEADS)
# takaritas igeny szerint
.PHONY: clean
clean:
rm -f $(OBJS) $(PROG)
......@@ -2,7 +2,7 @@
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="alakzat2" />
<Option title="alakzat" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
......@@ -32,19 +32,18 @@
<Compiler>
<Add option="-pedantic" />
<Add option="-Wall" />
<Add option="-DMEMTRACE" />
<Add option="-Werror" />
</Compiler>
<Unit filename="alakzat.cpp" />
<Unit filename="alakzat.h" />
<Unit filename="alakzat2_main.cpp" />
<Unit filename="alakzat_main.cpp" />
<Unit filename="ellipszis.h" />
<Unit filename="haromszog.cpp" />
<Unit filename="haromszog.h" />
<Unit filename="kor.cpp" />
<Unit filename="kor.h" />
<Unit filename="memtrace.cpp" />
<Unit filename="memtrace.h" />
<Unit filename="poligon.cpp" />
<Unit filename="poligon.h" />
<Unit filename="pont.cpp" />
<Unit filename="pont.h" />
<Unit filename="rajztabla.cpp" />
......@@ -53,11 +52,18 @@
<Unit filename="szakasz.h" />
<Unit filename="szin.cpp" />
<Unit filename="szin.h" />
<Unit filename="teglalap.cpp" />
<Unit filename="teglalap.h" />
<Extensions>
<code_completion />
<debugger />
<DoxyBlocks>
<comment_style block="0" line="0" />
<doxyfile_project />
<doxyfile_build />
<doxyfile_warnings />
<doxyfile_output />
<doxyfile_dot />
<general />
</DoxyBlocks>
<envvars />
</Extensions>
</Project>
......
/**
* \file kor.cpp
* Alakzat osztály tagfüggvényinek megvalósítása
* Alakzat osztály tagfüggvényeinek megvalósítása
*/
#include "alakzat.h"
/// mozgat - eltolja az alakzat origóját
/// @param d - eltolás vektora
/// @param d - eltolás
void Alakzat::mozgat(const Pont& d) {
Szin tsz = sz; /// tényleges rajzolási szín elmentése
sz = BACKGND; // rajzolási szín legyen a háttér színe
rajzol(); // A vonal letörlés az eredeti helyről
p0 += d; // mozgatás: a pozíció változik
sz = tsz; // rajzolási szín a tényleges szín
rajzol(); // A vonal felrajzolása az új pozícióra
sz = BACKGND; /// rajzolási szín legyen a háttér színe
rajzol(); /// letörlés az eredeti helyről (rajzolás háttér színnel)
p0 += d; /// mozgatás: a pozíció változik
sz = tsz; /// rajzolási szín a tényleges szín
rajzol(); /// felrajzolása az új pozícióra
}
/// Globális << operátor
/// Globális << operátor az Alakzat adatainak kiírásához
std::ostream& operator<<(std::ostream& os, const Alakzat& a) {
return os << "p0=" << a.getp0() << ",szin=" << a.getsz();
}
......@@ -6,16 +6,15 @@
#define ALAKZAT_H
#include <iostream> // ostream miatt kell
#include "memtrace.h" // így mindenki include-olni fogja, mert az alaposztályt minden fordítási egység
#include "memtrace.h"
#include "pont.h"
#include "szin.h"
/// Alakzat abszrakt osztály
class Alakzat {
protected:
Pont p0; ///< alakzat origója
Szin sz; ///< alakzat színe
Pont p0; /// Alakzat origója, vagy bázis pontja.
/// Minden további adatot ehhez relatívan tárolunk. Geometriai értelemben nem feltétlenül origó.
Szin sz; /// alakzat színe
public:
/// Konstruktor
/// @param p0 - kezdőpont
......@@ -24,25 +23,28 @@ public:
/// Pozíció lekérdezése
/// @return alakzat origója
Pont getp0() const { return p0; }
const Pont& getp0() const { return p0; }
/// Szin lekérdezése
/// @return alakzat színe
Szin getsz() const { return sz; }
const Szin& getsz() const { return sz; }
/// mozgat: origóját eltolja
/// @param d - eltolás vektora
void mozgat(const Pont& d);
/// rajzol
virtual void rajzol() = 0;
virtual void rajzol() const = 0;
/// Destruktor virtuális, hogy lehessen dinamikus adattagja
/// a származtatottnak
virtual ~Alakzat() {}
};
/// Globális << operátor
std::ostream& operator<<(std::ostream&, const Alakzat&);
/// Globális << operátor az Alakzat adatainak kiírásához
/// @param os - ostream
/// @param a - alakzat
/// @return os - ostream
std::ostream& operator<<(std::ostream& os, const Alakzat& a);
#endif // ALAKZAT_H
<?xml version="1.0" encoding="windows-1250"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Name="alakzat"
ProjectGUID="{30ABAD03-BC11-488A-B71E-C9347DA9B929}"
RootNamespace="alakzat"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;MEMTRACE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\alakzat.cpp"
>
</File>
<File
RelativePath=".\kor.cpp"
>
</File>
<File
RelativePath=".\main.cpp"
>
</File>
<File
RelativePath=".\pont.cpp"
>
</File>
<File
RelativePath=".\szakasz.cpp"
>
</File>
<File
RelativePath=".\szin.cpp"
>
</File>
<File
RelativePath=".\memtrace.cpp"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath=".\alakzat.h"
>
</File>
<File
RelativePath=".\kor.h"
>
</File>
<File
RelativePath=".\pont.h"
>
</File>
<File
RelativePath=".\szakasz.h"
>
</File>
<File
RelativePath=".\szin.h"
>
</File>
<File
RelativePath=".\memtrace.h"
>
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
/**
* \file alakzat2_main.cpp
* Demó program az alakzat és rajztábla osztályok kipróbálására.
* Felrajzol pár alakzatot, majd elmozgatja kicsit.
*
* ELKESZULT makró értékei:
* <= 2 - ld. alakzat_main.cpp. Ebben a főprogramban nimcs hozzá kód.
* >= 3 - van már Rajztabla osztály, létrehozható, meszüntethető (ez az alapeset)
* >= 4 - törlés kivételével minden Rajztabla funkciót kipróbálunk
* >= 5 - törlést is próbáljuk
* >= 6 - globális rajtabla insertert is kipróbáljuk
* >= 7 - szorgalmi: téglalap osztály is van
*/
#define ELKESZULT 3
#include <iostream>
#include "szakasz.h"
#include "kor.h"
#if ELKESZULT >= 1
# include "haromszog.h"
#endif // ELKESZULT
#if ELKESZULT >= 2
# include "ellipszis.h"
#endif // ELKESZULT
#if ELKESZULT >= 3
# include "rajztabla.h"
#endif // ELKESZULT
#if ELKESZULT >= 7
#include "teglalap.h"
#endif // ELKESZULT
using std::cout;
using std::endl;
int main(int argc, char** argv) {
#if ELKESZULT >= 3 // van rajztábla
Rajztabla tabla;
cout << "tabla.size: " << tabla.size() << endl;
#endif // ELKESZULT
#if ELKESZULT >= 4 // van rajztábla és ráteszünk alakzatokat
tabla.felrak(new Szakasz(Pont(20,40), 100, 0, WHITE));
cout << "tabla.size: " << tabla.size() << endl;
tabla.felrak(new Kor(Pont(120,140), 50, BLUE));
cout << "tabla.size: " << tabla.size() << endl;
tabla.felrak(new Haromszog(Pont(130,150), Pont(230, 150), Pont(280, 200), RED));
cout << "tabla.size: " << tabla.size() << endl;
tabla.felrak(new Ellipszis(Pont(100,100), 20, 0.5, GREEN));
cout << "tabla.size: " << tabla.size() << endl;
#endif // ELKESZULT
#if ELKESZULT >= 7 // szorgalmi: téglalap
tabla.felrak(new Teglalap(Pont(20,40), Pont(60, 100), GREEN));
cout << "tabla.size: " << tabla.size() << endl;
#endif // ELKESZULT
#if ELKESZULT >= 4 // van rajztábla és kiírjuk mi van rajta.
cout << "Rajztabla rajzol:" << endl;
tabla.rajzol();
Pont delta(100, -10);
cout << endl << "Rajztabla mozgat delta=" << delta << ":" << endl;
tabla.mozgat(delta);
#endif // ELKESZULT
#if ELKESZULT >= 6 // Van iserter
cout << "\nRajztabla inserter:" << endl;
cout << tabla << endl;
#endif // ELKESZULT
#if ELKESZULT >= 5 // a törlés is megy?
cout << "\nRajztabla torol:" << endl;
tabla.torol();
cout << "tabla.size: " << tabla.size() << endl;
tabla.felrak(new Kor(Pont(10,20), 50, RED));
cout << "tabla.size: " << tabla.size() << endl;
cout << endl << "Rajztabla rajzol:" << endl;
tabla.rajzol();
#endif // ELKESZULT
#if ELKESZULT < 5
cout << "Legalabb ELKESZULT == 5-ig oldja meg a feladatokat!\n";
#endif // ELKESZULT
return 0;
}
/**
* \file alakzat_main.cpp
* Demo program az alakzat osztályok kipróbálására.
* Felrajzol pár alakzatot, majd elmozgatja kicsit.
*
* ELKESZULT makró értékei:
* <= 0 - alap, nincs újabb osztály kész
* >= 1 - elkészült a háromszög osztály
* >= 2 - ellipszis osztályt is kipróbáljuk
*/
#define ELKESZULT 0
#include <iostream>
#include "szakasz.h"
#include "kor.h"
#if ELKESZULT >= 1
# include "haromszog.h"
#endif // ELKESZULT
#if ELKESZULT >= 2
# include "ellipszis.h"
#endif // ELKESZULT
using std::cout;
using std::endl;
int main(int argc, char** argv) {
const int N = 100; // maximum 100 alakzatunk lehet
Alakzat *idom[N];
int db = 0; // most nincs egy se
/// Létrehozunk egy szakaszt egy pontból és dx, dy távolságokból
std::cout << "\n";
Szakasz sz1(Pont(20,40), 100, 0, WHITE);
std::cout << sz1 << std::endl; // kiírjuk az adatait
sz1.rajzol(); // "felrajzoljuk"
idom[db++] = &sz1; // nem kell cast, mert kompatibilis
/// Létrehozunk egy kört a középpontból és a sugarából
std::cout << "\n";
Kor k1(Pont(120,140), 50, BLUE);
std::cout << k1 << std::endl; // kiírjuk az adatait
k1.rajzol(); // "felrajzoljuk"
idom[db++] = &k1;
#if ELKESZULT >= 1
/// Létrehozunk egy háromszöget három pontból
std::cout << "\n";
Haromszog h1(Pont(130,150), Pont(230, 150), Pont(280, 200), RED);
std::cout << h1 << std::endl; // kiírjuk az adatait
h1.rajzol(); // "felrajzoljuk"
idom[db++] = &h1;
#endif // ELKESZULT
#if ELKESZULT >= 2
/// Létrehozunk egy ellipszist középpontból, sugárból és excentritásból
std::cout << "\n";
Ellipszis e1(Pont(100,100), 20, 0.5, GREEN);
std::cout << e1 << std::endl; // kiírjuk az adatait
e1.rajzol(); // "felrajzoljuk"
idom[db++] = &e1;
#endif // ELKESZULT
cout << "\nMost kirajzoljuk alaposztaly pointerrel:" << endl;
for (int i = 0; i < db; i++) // végigmegyünk az összes alakzaton
idom[i]->rajzol(); // kirajzoljuk
cout << "\nMost mozgatunk (x+100, y+100) (pointerrel):" << endl;
for (int i = 0; i < db; i++) // az összes alakzatra
idom[i]->mozgat(Pont(100, 100)); // kicsit mozdítunk rajta
return 0;
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<diagram program="umlet" version="14.2">
<help_text>// Uncomment the following line to change the fontsize and font:
fontsize=14
// fontfamily=SansSerif //possible: SansSerif,Serif,Monospaced
//////////////////////////////////////////////////////////////////////////////////////////////
// Welcome to UMLet!
//
// Double-click on elements to add them to the diagram, or to copy them
// Edit elements by modifying the text in this panel
// Hold Ctrl to select multiple elements
// Use Ctrl+mouse to select via lasso
//
// Use +/- or Ctrl+mouse wheel to zoom
// Drag a whole relation at its central square icon
//
// Press Ctrl+C to copy the whole diagram to the system clipboard (then just paste it to, eg, Word)
// Edit the files in the "palettes" directory to create your own element palettes
//
// Select "Custom Elements &gt; New..." to create new element types
//////////////////////////////////////////////////////////////////////////////////////////////
// This text will be stored with each diagram; use it for notes.</help_text>
<zoom_level>10</zoom_level>
<element>
<type>com.baselet.element.old.element.Class</type>
<coordinates>
<x>150</x>
<y>40</y>
<w>240</w>
<h>170</h>
</coordinates>
<panel_attributes>/Alakzat/
--
-p0: Pont
-sz: Szin
--
+Alakzat(Pont&amp;, Szin&amp;)
+getp0(): Pont;
+getsz(): Szin;
+mozgat(): void
/+rajzol(): virtual void/
+~Alakzat(): virtual</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.baselet.element.old.element.Class</type>
<coordinates>
<x>290</x>
<y>280</y>
<w>230</w>
<h>120</h>
</coordinates>
<panel_attributes>Szakasz
--
-pv: Pont
--
+Szakasz(Pont&amp;, Pont&amp;, Szin&amp;)
+Szakasz(Pont&amp;, int, int, Szin&amp;)
+getpv(): Pont;
+Rajzol(): void
</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.baselet.element.old.element.Class</type>
<coordinates>
<x>40</x>
<y>280</y>
<w>230</w>
<h>120</h>
</coordinates>
<panel_attributes>Kor
--
- r: int
--
+ Kor(Pont&amp;, int, Szin&amp;)
+ getr(): int;
+ Rajzol(): void
</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.baselet.element.old.element.Relation</type>
<coordinates>
<x>120</x>
<y>180</y>
<w>150</w>
<h>120</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;-</panel_attributes>
<additional_attributes>130;30;30;100</additional_attributes>
</element>
<element>
<type>com.baselet.element.old.element.Relation</type>
<coordinates>
<x>260</x>
<y>180</y>
<w>160</w>
<h>120</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;-</panel_attributes>
<additional_attributes>30;30;140;100</additional_attributes>
</element>
<element>
<type>com.baselet.element.old.element.Class</type>
<coordinates>
<x>540</x>
<y>40</y>
<w>230</w>
<h>120</h>
</coordinates>
<panel_attributes>Pont
--
+x: int
+y: int
--
+Pont(int, int)
+operator+=(Pont): Pont&amp;
+operator-(Pont): Pont</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.baselet.element.old.element.Relation</type>
<coordinates>
<x>360</x>
<y>50</y>
<w>200</w>
<h>50</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;&lt;&lt;-
m1=1
m2=1
</panel_attributes>
<additional_attributes>30;30;180;30</additional_attributes>
</element>
<element>
<type>com.baselet.element.old.element.Relation</type>
<coordinates>
<x>490</x>
<y>130</y>
<w>180</w>
<h>200</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;&lt;&lt;-
m1=1
m2=1</panel_attributes>
<additional_attributes>30;180;160;180;160;30</additional_attributes>
</element>
</diagram>
/**
* \file ellipszis.h
* Ellipszis osztály deklarációja és definiciója.
*
* !!!HIBÁS!!!
* Ez a megoldás egy könnyen elkövethető hibát mutat be.
* A hiba elkövetését a "mindent írjunk egy fájlba" gondolat/gyakorlat mágnesként vonzza.
*
* A hiba igazi oka a kompatibilitásból fakadó típuskonverzióra vezethető vissza.
*
*
*/
#ifndef ELLIPSZIS_H
#define ELLIPSZIS_H
#include "kor.h"
/// Ellipszis osztály.
/// A Kor adatait excentritás értékkel bővítjük
class Ellipszis : public Kor {
double e; /// excentritás értéke [ e = c/a, e = sqrt(1-b^2/a^2) ]
public:
/// konstruktor 2 pontból
/// @param p0 - kezdőpont
/// @param r - sugár
/// @param e - excentritás
/// @param sz - szín és átlátszóság
Ellipszis(const Pont& p0, int r, double e, Szin sz)
: Kor(p0, r, sz), e(e) { }
/// Ellipszis excentritásának lekérdezse
/// @return excentritás
double gete() const { return e; }
/// Eltipszist rajzol
void rajzol() const { std::cout << "Rajzol: " << *this << std::endl; }
};
/// Globális << operátor a Ellipszis adatainak kiírásához
/// @param os - ostream
/// @param el - ellipszis
/// @return os - ostream
inline std::ostream& operator<<(std::ostream& os, const Ellipszis& el) {
return os << "Ellipszis " << (Alakzat&)el << ",r=" << el.getr() << ",e=" << el.gete();
}
#endif // ELLIPSZIS_H
/**
* \file haromszog.cpp
* Haromszog osztály tagfüggvényeinek megvalósítása
*/
#include "haromszog.h"
/**
* \file haromszog.h
* Haromszog osztály deklarációja
*/
#ifndef HAROMSZOG_H
#define HAROMSZOG_H
/// Ügyeljen arra, hogy a csúcspontokat az alaposztály orgiójához relatívan tárolja!
#endif // KOR_H
/**
* \file kor.cpp
* Kor osztály tagfüggvényinek megvalósítása
* Kor osztly tagfggvnyeinek megvalstsa
*/
#include "kor.h"
/// Kört rajzoló rajzol fv.
void Kor::rajzol() {
/// Krt rajzol rajzol fv.
void Kor::rajzol() const {
std::cout << "Rajzol: " << *this << std::endl;
}
/// Globális << operátor
/// Globlis << opertor a Kor adatainak kirshoz
std::ostream& operator<<(std::ostream& os, const Kor& k) {
return os << "Kor " << (Alakzat&)k << ",r=" << k.getr();
}
......@@ -7,16 +7,17 @@
#include "alakzat.h"
/// Kor osztály
/// Kor osztály.
/// Az alaposztály adatait sugárral bővítjük
class Kor : public Alakzat {
int r; ///< sugár
int r; /// sugár
public:
/// Konstruktor
/// @param p0 - kezdőpont
/// @param r - sugár
/// @param sz - szín és átlátszóság
Kor(const Pont& p0, int r, Szin sz)
:Alakzat(p0, sz), r(r) /// ős osztály inic
:Alakzat(p0, sz), r(r) /// ős osztály inic.
{}
/// Sugár lekérdezése
......@@ -24,10 +25,13 @@ public:
int getr() const { return r; }
/// kört rajzol
void rajzol();
void rajzol() const;
};
/// Globális << operátor
/// Globális << operátor a Kor adatainak kiírásához
/// @param os - ostream
/// @param k - kor
/// @return os - ostream
std::ostream& operator<<(std::ostream& os, const Kor& k);
#endif // KOR_H
......@@ -7,7 +7,6 @@ VS 2012: Szeberényi Imre, 2015.,
mem_dump: 2016.
meset felszabaditaskor: 2018.
typo: 2019.
singleton: 2019.
*********************************/
/*definialni kell, ha nem paracssorbol allitjuk be (-DMEMTRACE) */
......@@ -488,7 +487,15 @@ void operator delete(void * p) THROW_NOTHING {
void operator delete[](void * p) THROW_NOTHING {
memtrace::traced_delete(p,FDELETEARR);
}
#if __cplusplus >= 201402L
void operator delete(void * p, size_t) THROW_NOTHING {
memtrace::traced_delete(p,FDELETE);
}
void operator delete[](void * p, size_t) THROW_NOTHING {
memtrace::traced_delete(p,FDELETEARR);
}
#endif
/* Visual C++ 2012 miatt kell, mert háklis, hogy nincs megfelelő delete, bár senki sem használja */
void operator delete(void * p, int, const char *) THROW_NOTHING {
......@@ -530,5 +537,9 @@ START_NAMESPACE
}
}
#if defined(MEMTRACE_TO_MEMORY) && defined(USE_ATEXIT_OBJECT)
int atexit_class::counter = 0;
int atexit_class::err = 0;
#endif
END_NAMESPACE
#endif
......@@ -5,8 +5,7 @@ Keszitette: Peregi Tamas, BME IIT, 2011
Kanari: Szeberenyi Imre, 2013.,
VS 2012: Szeberényi Imre, 2015.,
mem_dump: 2016.
inclue-ok: 2017., 2018. 2019.
singleton: 2019.
inclue-ok: 2017., 2018., 2019., 2021.
*********************************/
#ifndef MEMTRACE_H
......@@ -111,20 +110,23 @@ END_NAMESPACE
START_NAMESPACE
class atexit_class {
private:
static int counter;
static int err;
public:
atexit_class() {
#if defined(CPORTA) && !defined(CPORTA_NOSETBUF)
setbuf(stdout, 0);
setbuf(stderr, 0);
if (counter == 0) {
setbuf(stdout, 0);
setbuf(stderr, 0);
}
#endif
counter++;
}
public:
static atexit_class& get_atexit_obj() {
static atexit_class instance; // singleton példány
return instance;
}
int check() {
return mem_check();
if(--counter == 0)
err = mem_check();
return err;
}
~atexit_class() {
......@@ -132,9 +134,7 @@ START_NAMESPACE
}
};
/// A statikus referencia minden fordítási egységben keletkezik, de
/// mindegyik egyetlen példányra fog hivatkozni a singleton minta miatt
static atexit_class& atexit_obj = atexit_class::get_atexit_obj();
static atexit_class atexit_obj;
END_NAMESPACE
#endif/*MEMTRACE_TO_MEMORY && USE_ATEXIT_OBJECT*/
......@@ -153,6 +153,13 @@ END_NAMESPACE
#include <map>
#include <algorithm>
#include <functional>
#include <memory>
#include <iomanip>
#include <locale>
#include <typeinfo>
#include <ostream>
#include <stdexcept>
#include <ctime>
#endif
#ifdef MEMTRACE_CPP
namespace std {
......@@ -178,7 +185,7 @@ START_NAMESPACE
#define realloc(old,size) TRACEC(traced_realloc)(old,size,#size,__LINE__,__FILE__)
void * traced_realloc(void * old, size_t size, const char *size_txt, int line, const char * file);
void mem_dump(void const *mem, size_t size, FILE* fp);
void mem_dump(void const *mem, size_t size, FILE* fp = stdout);
END_NAMESPACE
......@@ -200,6 +207,12 @@ void * operator new[](size_t size) THROW_BADALLOC;
void operator delete(void * p) THROW_NOTHING;
void operator delete[](void * p) THROW_NOTHING;
#if __cplusplus >= 201402L
// sized delete miatt: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3536.html
void operator delete(void * p, size_t) THROW_NOTHING;
void operator delete[](void * p, size_t) THROW_NOTHING;
#endif
/* Visual C++ 2012 miatt kell, mert háklis, hogy nincs megfelelő delete, bár senki sem használja */
void operator delete(void *p, int, const char *) THROW_NOTHING;
void operator delete[](void *p, int, const char *) THROW_NOTHING;
......@@ -215,5 +228,8 @@ void operator delete[](void *p, int, const char *) THROW_NOTHING;
#endif /*MEMTRACE_CPP*/
#endif /*FROM_MEMTRACE_CPP*/
#endif /*MEMCHECK*/
#else
#pragma message ( "MEMTRACE NOT DEFINED" )
#endif /*MEMTRACE*/
#endif /*MEMTRACE_H*/
/**
* \file pont.cpp
* Pont osztály tagfüggvényeinek megvalósítása
* Pont osztály tagfüggvényeinek megvalósítása
*/
#include "pont.h"
......@@ -12,17 +12,17 @@ Pont& Pont::operator+=(const Pont& rhs_p) {
return *this;
}
/// + operator
Pont Pont::operator+(const Pont& rhs_p) const {
return Pont(rhs_p.x+x, rhs_p.y+y);
}
/// - operator
Pont Pont::operator-(const Pont& rhs_p) const {
return Pont(x-rhs_p.x, y-rhs_p.y);
}
/// + operator
Pont Pont::operator+(const Pont& rhs_p) const {
return Pont(x+rhs_p.x, y+rhs_p.y);
}
/// Globális << operátor
/// Globális << operátor a Pont adatainak kiírásához
std::ostream& operator<<(std::ostream& os, const Pont& p) {
return os << "(" << p.x <<"," << p.y << ")";
}
......@@ -8,11 +8,11 @@
/// Pont osztály
/// Az egyszerűség kedvéért minden tagja publikus.
/// Így nem kell getter, meg setter.
/// Csak azok az operatorok lettek megvalósítva, melyeket használ a demó
/// Így nem kell getter/setter.
/// Csak azok az operatorok lettek megvalósítva, melyeket használ a demo
struct Pont {
int x; ///< x koordináta
int y; ///< y koordináta
int x;
int y;
Pont(int x = 0, int y = 0) :x(x), y(y) {}
/// += operator
......@@ -24,17 +24,17 @@ struct Pont {
/// @param rhs_p - jobb oldali operandus (Pont)
/// @return új objektum (Pont) a két pont összege
Pont operator+(const Pont& rhs_p) const;
/// @return megvá pont
/// - operator
/// @param rhs_p - jobb oldali operandus (Pont)
/// @return új új objektum (Pont) a két pont különbsége
/// @return új objektum (Pont) a két pont különbsége
Pont operator-(const Pont& rhs_p) const;
};
/// Globális <<< operátor
/// Globális << operátor a Pont adatainak kiírásához
/// @param os - ostream
/// @param p - pont
/// @return os - ostream
std::ostream& operator<<(std::ostream& os, const Pont& p);
#endif // PONT_H
/**
* \file rajztabla.cpp
* Rajztábla osztály tagfüggvényinek megvalósítása
* Ebben a fájlban valósítsa meg a Rajztábla osztály nem inline tagfüggvényeit
*/
#include <stdexcept>
#include "rajztabla.h"
#error "itt valositsa meg a Rajztabla osztály tagfuggvenyeit!"
#include "rajztabla.h"
/**
* \file rajztabla.h
* Rajztabla osztály deklarációja
*/
#ifndef RAJZTABLA_H
#define RAJZTABLA_H
#include "alakzat.h"
/// Rajztabla osztály
class Rajztabla {
static const size_t MAXDB = 100;///< legegyszerűbb így belső (egész) konstanst felvenni egy osztályban.
Alakzat* tabla[MAXDB]; ///< tároló
size_t db; ///< aktuális darabszám
/// "Elrejtett" másoló konstruktor és értékadó operátor.
/// Az alapértelmezett változat nem jó, ezért ne legyen elérhető.
Rajztabla(const Rajztabla& rhs);
Rajztabla& operator=(const Rajztabla& rhs);
public:
Rajztabla() :db(0) { }
/// Visszadja, hogy hány síkidom van a táblán
/// @return - darabszám
size_t size() const { return db; }
/// Alakzatot tesz a rajztáblára
/// @param ap - pointer az alakzatra
void felrak(Alakzat *ap);
/// Kirajzolja az összes alakzatot
void rajzol() const ;
/// Az összes alakzatot elmozdítja
/// @param d - eltolás vektora
void mozgat(const Pont& d) const ;
#if ELKESZULT >= 5
/// letörli a táblát eltávolítja az objektumokat
void torol();
#endif // ELKESZULT
/// Lehet, hogy kell destruktor is.
};
#endif // RAJZTABLA_H
/**
* \file szakasz.cpp
* Szakasz osztály tagfüggvényinek megvalósítása
* Szakasz osztly tagfggvnyeinek megvalstsa
*/
#include "szakasz.h"
/// Szakaszt rajzoló rajzol fv.
void Szakasz::rajzol() {
/// Szakaszt rajzol rajzol fv.
void Szakasz::rajzol() const {
std::cout << "Rajzol: " << *this << std::endl;
}
/// Globális << operátor
/// Globlis << opertor a Szakasz adatainak kirshoz
std::ostream& operator<<(std::ostream& os, const Szakasz& sz) {
return os << "Szakasz " << (Alakzat&)sz << ",pv=" << sz.getpv();
}
......@@ -7,9 +7,10 @@
#include "alakzat.h"
/// Szakasz osztály
/// Szakasz osztály.
/// Az alaposztály adatait egy újabb ponttal bővítjük
class Szakasz : public Alakzat {
Pont pv; ///< szakasz végpontja az origóhoz (p0-hoz) képest
Pont pv; /// szakasz végpontja az origójához (p0) relatívan
public:
/// konstruktor 2 pontból
/// @param p0 - kezdőpont
......@@ -18,23 +19,26 @@ public:
Szakasz(const Pont& p0, const Pont& pv, Szin sz)
: Alakzat(p0, sz), pv(pv-p0) { }
/// konstruktor 1 pontból és 2 hosszból
/// @param p0 - kezdőpont
/// @param xl - x irányú hossz
/// @param yl - y irányú hossz
/// konstruktor 1 pontból és 2 távolságból
/// @param p0 - kezdõpont
/// @param dx - x irányú távolság
/// @param dy - y irányú távolság
/// @param sz - szín és átlátszóság
Szakasz(const Pont& p0, int xl, int yl, Szin sz)
: Alakzat(p0, sz), pv(Pont(xl, yl)) { }
Szakasz(const Pont& p0, int dx, int dy, Szin sz)
: Alakzat(p0, sz), pv(getp0()+Pont(dx, dy)) { }
/// Szakasz végpontjának lekérdezése
/// @return szakasz végpontja
Pont getpv() const { return pv+p0; } // p0-hoz lépest relatívan tárolunk
Pont getpv() const { return getp0()+pv; }
/// szakaszt rajzol
void rajzol(); // átdefiniáljuk a virt. fv-t.
void rajzol() const; // átdefiniáljuk a virt. fv-t.
};
/// Globális << operátor
std::ostream& operator<<(std::ostream& os, const Szakasz& k);
/// Globális << operátor a Szakasz adatainak kiírásához
/// @param os - ostream
/// @param sz - szakasz
/// @return os - ostream
std::ostream& operator<<(std::ostream& os, const Szakasz& sz);
#endif // SZAKASZ_H
......@@ -7,7 +7,7 @@
// Szinek szövegkonstansai
static const char* szinek[] = { "BLACK", "WHITE", "RED", "GREEN", "BLUE" } ;
/// Globális << operátor
/// Globális << operátor a Szin kiírásához
/// Nincs ellenőrzés a túlindexelésre !
std::ostream& operator<<(std::ostream& os, Szin sz) {
return os << szinek[sz];
......
# Makefile Alakzatlab2-hoz
# Solaris (ural2) es Linux ala.
objs = alakzat.o pont.o szin.o kor.o szakasz.o teglalap.o \
haromszog.o poligon.o rajztabla.o main.o memtrace.o
heads = alakzat.h pont.h szin.h kor.h szakasz.h teglalap.h \
haromszog.h poligon.h rajztabla.h memtrace.h
CXX = g++ # # a C++ fordito neve
#CXX = clang++ # # clang-ot (llvm) is erdemes kiprobalni
CXXFLAGS = -pedantic -Wall -Werror # C++ kapcsolok: legyen bobeszedu,
CXXFLAGS += -g # # ... es legyen debug info is
CXXFLAGS += -DMEMTRACE
# alapertelmezett cel: erdeklodik, hogy melyik legyen
.PHONY: all
all: $(objs)
$(CXX) $(objs) -o alakzat2
$(objs1): $(heads)
# takaritas igeny szerint
.PHONY: clean
clean:
rm -f $(objs) alakzat2
/**
* \file main.cpp
* Demó program az alakzat és rajztábla osztályok kipróbálására.
* Felrajzol pár alakzatot, majd elmozgatja kicsit.
*/
#include <iostream>
#include "szakasz.h"
#include "kor.h"
#include "teglalap.h"
#include "haromszog.h"
#include "poligon.h"
#include "rajztabla.h"
using std::cout;
using std::endl;
//#define MASOL
int main(int argc, char** argv) {
Rajztabla tabla;
tabla.felrak(new Szakasz(Pont(20,40), 100, 0, WHITE));
tabla.felrak(new Kor(Pont(120,140), 50, BLUE));
tabla.felrak(new Teglalap(Pont(20,40), Pont(60, 100), GREEN));
tabla.felrak(new Haromszog(Pont(20,40), Pont(60, 100), Pont(50, 60), GREEN));
Poligon* poli = new Poligon(Pont(120,140), GREEN);
poli->add(Pont(120,200));
poli->add(Pont(250,200));
tabla.felrak(poli);
cout << "Rajztabla rajzol:" << endl;
tabla.rajzol();
Pont delta(100, -10);
cout << endl << "Rajztabla mozgat delta=" << delta << ":" << endl;
tabla.mozgat(delta);
cout << "\nRajztabla torol:" << endl;
tabla.torol();
tabla.felrak(new Kor(Pont(10,20), 50, RED));
cout << endl << "Rajztabla rajzol:" << endl;
tabla.rajzol();
#ifdef MASOL
Rajztabla masik;
masik = tabla;
cout << endl << "Masik rajztabla rajzol:" << endl;
masik.rajzol();
#endif
return 0;
}
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{2F45B2D3-9FE7-4975-BEAE-D3D24AACE45B}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>Alakzatlab</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v110</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v110</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;MEMTRACE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="alakzat.h" />
<ClInclude Include="haromszog.h" />
<ClInclude Include="kor.h" />
<ClInclude Include="memtrace.h" />
<ClInclude Include="poligon.h" />
<ClInclude Include="pont.h" />
<ClInclude Include="rajztabla.h" />
<ClInclude Include="szakasz.h" />
<ClInclude Include="szin.h" />
<ClInclude Include="teglalap.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="alakzat.cpp" />
<ClCompile Include="haromszog.cpp" />
<ClCompile Include="kor.cpp" />
<ClCompile Include="alakzat2_main.cpp" />
<ClCompile Include="memtrace.cpp" />
<ClCompile Include="poligon.cpp" />
<ClCompile Include="pont.cpp" />
<ClCompile Include="rajztabla.cpp" />
<ClCompile Include="szakasz.cpp" />
<ClCompile Include="szin.cpp" />
<ClCompile Include="teglalap.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="alakzat.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="haromszog.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="kor.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="memtrace.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="poligon.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="pont.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="rajztabla.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="szakasz.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="szin.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="teglalap.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="alakzat.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="haromszog.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="kor.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="main.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="memtrace.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="poligon.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pont.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="rajztabla.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="szakasz.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="szin.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="teglalap.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
/**
* \file haromszog.cpp
* Haromszog osztály tagfüggvényinek megvalósítása
*/
#include "haromszog.h"
/// Háromszög rajzoló rajzol fv.
void Haromszog::rajzol() {
std::cout << "Rajzol: " << *this << std::endl;
}
/// Globális << operátor
std::ostream& operator<<(std::ostream& os, const Haromszog& h) {
return os << "Haromszog " << (Alakzat&)h << ",p1=" << h.getp1() << ",p2=" << h.getp2();
}
/**
* \file haromszog.h
* Haromszog osztály deklarációja
*/
#ifndef HAROMSZOG_H
#define HAROMSZOG_H
#include "alakzat.h"
/// Haromszog osztály
class Haromszog : public Alakzat {
Pont p1; ///< második csúcspont
Pont p2; ///< harmadik csúcspont
public:
/// Konstruktor
/// @param p0 - kezdőpont
/// @param p1 - második csúcspont
/// @param p2 - harmadik csúcspont
/// @param sz - szín és átlátszóság
Haromszog(const Pont& p0, const Pont& p1, const Pont &p2, Szin sz)
:Alakzat(p0, sz), p1(p1-p0), p2(p2-p0) // ős osztály inic.
{}
/// Második csúcspont lekérdezése
/// @return második csúcspont
Pont getp1() const { return p1+p0; } // p0-hoz képest relatívan tárolunk
/// Harmadik csúcspont lekérdezése
/// @return harmadik csúcspont
Pont getp2() const { return p2+p0; } // p0-hoz képest relatívan tárolunk
/// háromszöget rajzol
void rajzol();
};
/// Globális << operátor
std::ostream& operator<<(std::ostream& os, const Haromszog& t);
#endif // HAROMSZOG_H
/**
* \file kor.cpp
* Poligon osztály tagfüggvényinek megvalósítása
*/
#include <stdexcept>
#include "poligon.h"
Pont Poligon::getcsp(size_t i) const {
if (i >= np) throw std::out_of_range("Poligon: nincs ilyen csucspont!");
if (i == 0) return p0;
return pontok[i-1] + p0; // p0-hoz képest relatívan tárolunk
}
void Poligon::add(const Pont& p) {
Pont *tp = new Pont[np];
for (size_t i = 0; i < np-1; i++)
tp[i] = pontok[i];
delete[] pontok;
pontok = tp;
pontok[np-1] = p - p0; // kezdőponthoz képest relatívan tárolunk
++np;
}
void Poligon::rajzol() {
std::cout << "Rajzol: " << *this << std::endl;
}
std::ostream& operator<<(std::ostream& os, const Poligon& k) {
os << "Poligon " << (Alakzat&)k << ",csp=" << k.getnp();
for (size_t i = 1; i < k.getnp(); ++i)
os << ",p" << i << "=" << k.getcsp(i);
return os;
}
/**
* \file poligon.h
* Poligon osztály deklarációja
*/
#ifndef POLIGON_H
#define POLIGON_H
#include "alakzat.h"
/// Poligon osztály
/// dinamikusan tárolja a csúcspontokat
class Poligon : public Alakzat {
Pont *pontok; ///< csúcspontok tárolója
size_t np; ///< ennyi csúcsból áll
public:
/// Konstruktor
/// @param p0 - kezdőpont
/// @param sz - szín és átlátszóság
Poligon(const Pont& p0, const Szin sz) :Alakzat(p0, sz), np(1)
{ pontok = new Pont[np-1]; } // eggyel kevesebbet foglal, mert a p0 az alaposztályban van
/// Csúcspontok darabszámának lekérdezése
/// @return darab
size_t getnp() const { return np; }
/// Adott csúcspont koordinátájának lekérdezése
/// Nem létező csp. esetén kivételt dob
/// @param i - i. csúcspont lekérdezése
/// @return csúcspont koordinátai
Pont getcsp(size_t i) const;
/// Új csúcspont felvétele
/// @param p - új csúcspont koordinátai
void add(const Pont& p);
/// Poligont rajzol
void rajzol();
~Poligon() { delete[] pontok; }
};
/// Globális << operátor
std::ostream& operator<<(std::ostream&, const Poligon&);
#endif // POLIGON_H
/**
* \file rajztabla.h
* Rajztabla osztály deklarációja
*/
#ifndef RAJZTABLA_H
#define RAJZTABLA_H
#include "alakzat.h"
#error "Itt deklaralja a Rajztabla osztalyt!"
#endif // RAJZTABLA_H
/**
* \file szin.h
* Szin deklarációja
*/
#ifndef SZIN_H
#define SZIN_H
#include <iostream> // ostream miatt kell
/// Szín
enum Szin { BLACK, WHITE, RED, GREEN, BLUE };
/// Háttérszín
const Szin BACKGND = BLACK;
/// Globális << operátor
std::ostream& operator<<(std::ostream& os, Szin sz);
#endif // SZIN_H
/**
* \file teglalap.cpp
* Teglalap osztály tagfüggvényinek megvalósítása
*/
#include "teglalap.h"
/// Téglalapot rajzoló rajzol fv.
void Teglalap::rajzol() {
std::cout << "Rajzol: " << *this << std::endl;
}
/// Globális << operátor
std::ostream& operator<<(std::ostream& os, const Teglalap& t) {
return os << "Teglalap " << (Alakzat&)t << ",p1=" << t.getp1();
}
/**
* \file teglalap.h
* Téglalap osztály deklarációja
*/
#ifndef TEGLALAP_H
#define TEGLALAP_H
#include "alakzat.h"
/// Teglalap osztály
/// Tengelyekkel párhuzamos oldalú téglalap
class Teglalap : public Alakzat {
Pont p1; ///< szemben levő csúcspont
public:
/// Konstruktor
/// @param p0 - kezdőpont
/// @param p1 - szemközti csúcspont
/// @param sz - szín és átlátszóság
Teglalap(const Pont& p0, const Pont& p1, Szin sz)
:Alakzat(p0, sz), p1(p1-p0) // ös ossztály inic
{}
/// Másik csúcspont lekérdezése
/// @return másik csúcspont
Pont getp1() const { return p1+p0; } // p0-hoz képest relatívan tárolunk
/// téglalapot rajzol
void rajzol();
};
/// Globális << operátor
std::ostream& operator<<(std::ostream& os, const Teglalap& t);
#endif // TEGLALAP_H
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