Quote:
Originally Posted by Dr. Coxxy
die explizite implementation eines dekonstruktors kann in vielen fällen nötig sein, halt um dinge aufzuräumen die im verlauf des objekts oder im konstruktor erstellt wurden.
der destruktor wird genauso "automatisch" aufgerufen wie der konstruktor.
konstruktor beim new oder explizit, dekonstruktor beim delete oder explizit - wobei die jeweiligen expliziten aufrufe meist zeichen für fehlerhaftes design sind.
|
Quote:
Originally Posted by NRj™
Okay verstehe...
Ich habe bei meinem Projekt gerade ein ganz anderes Problem:
Bekomme den Fehler: ' ... ' was not declared in this scope (also meine Funktionen)
Woran kann das liegen?
main:
Code:
#include <iostream>
#include "Bruch.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int main(int argc, char** argv) {
Bruch *b1, *b2;
b1 = new Bruch(2,1);
b2 = new Bruch(2,1);
print(b1);
return 0;
}
Bruch.cpp
Code:
#include "Bruch.h"
#include <iostream>
//Konstruktor
Bruch::Bruch(int z, int n)
{
zaehler = z;
nenner = n;
}
//setter
void Bruch::setBruch(int z, int n)
{
if(n != 0)
{
zaehler = z;
nenner = n;
}
else
{
std::cout << "Fehler: Nenner darf nicht 0 betragen!" << std::endl;
}
}
//getter
float Bruch::getBruch()
{
return (float)zaehler/(float)nenner;
}
//print
void Bruch::print(Bruch b1)
{
std::cout << b1.zaehler << "/" << b1.nenner << std::endl;
}
//mult
float Bruch::mult(Bruch b1, Bruch b2)
{
return (b1.zaehler * b2.zaehler) / (b1.nenner * b2.nenner);
}
Bruch.h
Code:
class Bruch{
private:
int zaehler;
int nenner;
public:
Bruch(); //Standartkonstruktor
Bruch(int,int); //Costum-Konstruktor
void setBruch(int,int);
float getBruch();
void print(Bruch);
float mult(Bruch, Bruch);
};
|
Wichtig ist aber auch, dass C++ eben nicht gleich Java ist. In C++ verwendest du das new-Schlüsselwort wesentlich seltener (bis hin zu gar nicht, seit C++11/14) als in Java, wo damit jedes Objekt erzeugt wird. new/delete wird nur für Objekte auf dem Heap verwendet (und auch da solltest du lieber zu Smartpointern und den entsprechenden Hilfsfunktionen greifen, um new/delete zu umgehen), für Objekte auf dem Stack ist das nicht notwendig. Letztere sind wenn möglich zu bevorzugen, weil du dich dann nicht darum kümmern musst, den Speicher wieder freizugeben - das passiert bei Objekten auf dem Stack automatisch. Der Konstruktor wird auch nicht nur bei new aufgerufen und der Destruktor nicht nur bei delete, sondern eben auch beim Auf- und Abbau des Stackframes.
Dein Code enthält (aufgrund o.g. Thematik) ein Memory Leak (auch wenn es in deinem Programm keine Auswirkung hat, weil das System beim Beenden des Programms den Speicher wieder freigibt). Du reservierst Speicher mit new, aber gibst ihn mit delete nicht mehr frei. Das solltest du auf jeden Fall vermeiden.
Zwar könntest du das beheben, indem du ans Ende der main die Objekte per delete wieder zerstörst, aber folgender Code wäre ebenfalls möglich (und besser):
Code:
#include <iostream>
#include "Bruch.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int main(int argc, char** argv) {
Bruch b1(2, 1), b2(2, 1); //alternativ: b1{2, 1} und b2{2, 1}
b1.print();
return 0;
}