Zusammenspiel von Klassen

R

rdg

???
Hi,
da ich meine c++ Kentnisse mal wieder ein wenig aufpolieren will, brauche ich mal wieder Eure hilfe(merkwürdig wenn's nicht so wär ;)).
Ich habe eine Klasse Termin:

#ifndef TERMIN_H
#define TERMIN_H
#include "Datum.h"

class Termin{
private:
string Betreff, Text;
Datum d;
public:
Termin( char* tmp_Betreff, char* tmp_Text, Datum tmp_d);
};

#endif

und eine Klasse Datum

#ifndef DATUM_H
#define DATUM_H

class Datum{
private:
int jahr, tag, monat;
public:
Datum(int tmp_tag, int tmp_monat,int tmp_jahr);
};

#endif

nun möchte ich dass beim Aufruf von Termin der Konstuktor auch ein Datumsobjekt erstellt und dieses dem Terminobjekt fest hinzufügt.
Kann mir jemand bitte sagen wie das genau geht? :think:
Die dafür notwendigen Konstruktoren:

Datum::Datum(int tmp_tag, int tmp_monat, int tmp_jahr){
tag = tmp_tag;
monat = tmp_monat;
jahr = tmp_jahr;
}

Termin::Termin( char* tmp_Betreff, char* tmp_Text, Datum tmp_d){
Betreff = tmp_Betreff;
Text = Text;
d = tmp_d;
}

Bekomme den Fehler:
Termin.cpp: In constructor ‘Termin::Termin(char*, char*, Datum)’:
Termin.cpp:4: error: no matching function for call to ‘Datum::Datum()’
Datum.h:8: note: candidates are: Datum::Datum(int, int, int)
Datum.h:4: note: Datum::Datum(const Datum&)

Wäre sehr, sehr dankar mal wieder darüber!!! :))

gruß
rdg :)
 
Zuletzt bearbeitet:
Leider nicht,
aber stimmt, ich werd nochmal den kompletten jetzt aktuellen Qcode hinzufügen.

main.cpp
#include "Datum.h"
#include "Termin.h"

using namespace std;

int main(int argc, char *argv[])
{
Termin a("a","b",Datum(1,1,2000));

}

Datum.h
#ifndef DATUM_H
#define DATUM_H

class Datum{
private:
int jahr, tag, monat;
public:
Datum(int tmp_tag, int tmp_monat,int tmp_jahr);
};

#endif

Datum.cpp
#include "Datum.h"

Datum::Datum(int tmp_tag, int tmp_monat, int tmp_jahr){
tag = tmp_tag;
monat = tmp_monat;
jahr = tmp_jahr;
}

Termin.h
#ifndef TERMIN_H
#define TERMIN_H
#include "Datum.h"

class Termin{
private:
char* Betreff, Text;
Datum d;
public:
Termin(char* tmp_Betreff, char* tmp_Text);
Termin(char* tmp_Betreff, char* tmp_Text, Datum*);
};

#endif

Termin.cpp
#include "Termin.h"
#include "Datum.h"


Termin::Termin(char* tmp_Betreff, char* tmp_Text){
Betreff = tmp_Betreff;
Text = tmp_Text;
}

Termin::Termin(char* tmp_Betreff, char* tmp_Text, Datum* tmp_d){
Betreff = tmp_Betreff;
Text = tmp_Text;
d = tmp_d;
}

Ich glaube das liegt an der Parameterübergabe, weil ich nicht weiss wann mann einen Zeiger, die Adresse oder die Klasse übergeben muss.
Auch wann man den Operator new verwendet weiss ich nicht.
:( :(

Das ist alles sehr verwirrend. ?(
 
Code:
class Termin : Datum

Damit ist Termin auch ein Datum.

Code:
class Termin : private Datum

Ist das selbe wie oben, nur dass hier ausschließlich Termin auf Datum zugreifen kann.

Code:
class Termin : protected Datum

Alle weiteren abgeleiteten Objekte können auf Datum zugreifen.

Gruß
Psyjo
 
Aber Termin soll doch nicht eine Unterklasse von Datum sein,
sondern Termin soll ein spezifisches Objekt von Datum haben. :think:

Denke ich hier falsch?! :(
Wenn ja warum?
 
Okay, was mir auffällt:

1) In der Termin.h fehlt in dem Konstruktor mit dem Datumszeiger ein Bezeichner.

2) Dieser Konstruktor erwartet einen Zeiger (nämlich Datum*), du übergibst aber in der main ein Objekt vom Typ Datum, nicht einen Zeiger auf ein Datum.

Also müsstest du entweder in der main aus dem
Code:
Datum(1,1,2000)
ein
Code:
new Datum(1,1,2000)
machen, oder den Konstruktor so verändern, dass ein Datum und kein Zeiger erwartet wird, also den * entfernen.
 
erstmal vielen dank!
hatte leider nicht richtig funktioniert. :O

aber glaube ich hab es jetzt.
Ich erstelle in Termin ein Datum d für den es keinen geeignetten Konstruktor gibt.


<- Habs jetzt geschafft, vielen dank für eure hilfe !!!
durch den Tipp new von Stollentroll bin ich drauf gekommen, nur weiß ich leider nicht richtig wie ich es anwenden kann.
 
Zuletzt bearbeitet:
Also:
(vorweg: in den Zeiten dazwischen habe ich mich auch mit ungarischer Noation versucht.
Was haltet Ihr davon :)))


ich habe einen Datum:: Datum() geschrieben
Datum:: Datum(){
m_nTag = 0;
m_nMonat = 0;
m_nJahr = 0;
}

dann:
void Datum::setDatum(int tmp_nTag, int tmp_nMonat, int tmp_nJahr){
m_nTag = tmp_nTag;
m_nMonat = tmp_nMonat;
m_nJahr = tmp_nJahr;
}

und den Termin Konstruktor umgeschrieben:
Termin::Termin(char* tmp_pchBetreff, char* tmp_pchText, int tmp_nTag, int tmp_nMonat, int tmp_nJahr){
m_pchBetreff = tmp_pchBetreff;
m_pchText = tmp_pchText;
d.setDatum(tmp_nTag,tmp_nMonat,tmp_nJahr);
}

so kann ich jetzt ein Terminobjekt mit:
Termin b("a","b",1,1,2000);
erstellen

Doch finde ich diese Lösung nicht besonders schön, besser wäre es,
wenn :
Termin b("a","b",new Datum(1,1,2000));
und so erst beim Termin Konstruktor das DatumsObjekt d erstellt wird,
da es so viel sauberer ist und auch nicht so fehleranfällig.

doch:
class Termin{
Datum d;
Termin(char* tmp_Betreff, char* tmp_Text, Datum);
}
hindern mich daran. Und ich weiss nicht, wie ich es Lösen kann.
 
Zuletzt bearbeitet:
Doch finde ich diese Lösung nicht besonders schön, besser wäre es,
wenn :
Termin b("a","b",new Datum(1,1,2000));
und so erst beim Termin Konstruktor das DatumsObjekt d erstellt wird,
da es so viel sauberer ist und auch nicht so fehleranfällig.

doch:

hindern mich daran. Und ich weiss nicht, wie ich es Lösen kann.

Ändere Termin ab:

Code:
class Termin{
Datum *d;
Termin(char* tmp_Betreff, char* tmp_Text, Datum* apc_d);
}

Entsprechend in der cpp:

Code:
Termin::Termin(char* tmp_pchBetreff, char* tmp_pchText, Datum *apc_d){
m_pchBetreff = tmp_pchBetreff;
m_pchText = tmp_pchText;
d = apc_d;
}
Dann solltest du diesen
Code:
Termin b("a","b",new Datum(1,1,2000));
Aufruf nutzen zu können.

Allerdings müsstest du jetzt noch einen Destruktor für Termin bauen, damit d beim Zerstören des Termins auch gelöscht wird.
 
Zuletzt bearbeitet:
Cool !!!
erstmal vielen dank es läuft durch. 8)

Destruktor-> habs gelöst

PS.: Was hälts du eigentlich von meiner ungarischen Notation hab ich es richtig gemacht, oder meine Variablen falsch deklarier? :brav:
 
Zuletzt bearbeitet:
Ich behaupte mal, richtig oder falsch gibt es nicht wirklich bei der ungarischen Notation.

Solange du das eh nur für dich machst, ist es egal, wenn du irgendwo arbeitest, solltest du dich den Standards dort anpassen...

Wichtig ist eigentlich nur, dass das ganze konsistent ist.
 
De Destruktor ist mir wieder weggesprungen:
-> funktioniert wieder

Aber abgesehen davon nochmals vielen dank hast mir sehr gehlofen !!!
UN <- hast recht, selber muss es einem gefallen.
 
Zuletzt bearbeitet:

Ähnliche Themen

GB-errinerung in QT hat Speicherzugrifsfehler

qt Anfängerprobleme

kompilier problem

Superkaramba @ Debian FEHLER????

Squid nur zum maskieren der eigenen IP, nicht für Webserver auf port 80

Zurück
Oben