Kindklassenobjekt in Elternklasse erstellen - möglich?



  • Etwas mehr Informationen wären sehr hilfreich.



  • Meine Header sieht derzeit folgendermaßen aus:

    class CKontoverwaltung
    {
    	private:
    
    	protected: 
    	char m_cAnzahlkonten;
    
    	public:
    	//Variablen
    	CKonto (*pKonto)[10];   //10, da maximal 10 Konten
    	//Funktionen
    	CKontoverwaltung();
    	virtual ~CKontoverwaltung();
    
    	void ErstelleKonto(char);
    	/*Erzeugt neue Konten mit passender Kontonummer	*/
    
    	void DelKonto(char);
    	/* Löscht nicht mehr benötigte Konten.	*/
    
    	void VergehEinMonat();
    	void VergehEinQuartal();
    	void VergehEinJahr();
    
    };
    
    class CKonto:public CKontoverwaltung
    {
    public:
    //Variablen
    double m_dKontostand;
    double m_dAktZinssatz;
    double m_dAktGebuchteZinsen;
    double m_dAktPrzVerzinsung;
    double m_dAktmonatlEinzahlung;
    double m_dAktmonatlAuszahlung;
    double m_dAktmonatlDauerzahlung;
    double m_dAktGebuehren;
    double m_dAktBuchungsgebuehren;
    
    //Funktionen
    CKonto();
    virtual ~CKonto();
    
    };
    

    Wichtig für mein Problem sind noch die Funktionen:
    void ErstelleKonto(char) und void DelKonto(char)

    void CKontoverwaltung::ErstelleKonto(char Kontonummer)
    {
    	pKonto[Kontonummer]= new CKonto();   
    	m_cAnzahlkonten++; //Damit stets im Überblick wie viele Konten gesamt existent.
    }
    
    void CKontoverwaltung::DelKonto(char Kontonummer)
    {
    	delete pKonto[Kontonummer];
    	pKonto[Kontonummer]=NULL;
    	m_cAnzahlkonten--;
    }
    

    Mehr Informationen benötigt?
    Kann meine Implementation funktionieren?



  • Blöde Frage aber müsste das ned so aussehen:

    pKonto* meine10Kinder;

    im Konstruktor:

    meine10Kinder = new pKonto[10];

    😕 😕



  • wieso ist ein Konto eine Kontoverwaltung?



  • Das ist vom Design her etwas fragwürdig. Durch Deine Vererbung drückst Du aus, dass ein Konto eine Kontoverwaltung ist. Das hat aber nur sehr bedingt Sinn.
    Deine Kontoverwaltung hat wohl eher Konten (nämlich die verwalteten). Ich würde also keine Vererbung einsetzen.



  • Jetzt versetz dich mal in die Lage des Compilers, der eine Datei von oben nach unten liest. Dann kommst du genau bis hier:

    class CKontoverwaltung
    {
        private:
    
        protected:
        char m_cAnzahlkonten;
    
        public:
        //Variablen
        CKonto (*pKonto)[10];
    

    und fragst dich: "was ist CKonto?" und kommst völlig aus dem Tritt und weißt nicht weiter. Nun versuchst du die Zeile an irgendwelche allgemeine Annahmen anzupassen, die deinem Compilerhersteller so in den Kopf kommen könnten und verhedderst dich noch mehr, was du mit einer Handvoll Fehlermeldungen quittierst bevor du aussteigst.

    Tip: google mal nach "forward declaration".
    Noch ein Tip: Ist ein Konto eine Kontoverwaltung? (public Vererbung heißt "ist ein")



  • Vielen Dank für die Tipps!
    Ich werde mir heute Nachmittag nochmal genauer Gedanken zu diesem Programm machen, aber fürs erste folgende Frage:
    Reicht es also, wenn ich CKonto als eigenständige Klasse erstelle und sie im HEader vor CKontoverwaltung setze? Könnte ich dir Pointer dann auf diese Art erzeugen?



  • duckman schrieb:

    Reicht es also, wenn ich CKonto als eigenständige Klasse erstelle und sie im HEader vor CKontoverwaltung setze? Könnte ich dir Pointer dann auf diese Art erzeugen?

    Könntest du nur, wenn CKonto nicht mehr von CKontoverwaltung ableitet. Du musst es aber nicht so machen.

    Ich kann mich nur wiederholen: google mal nach forward declaration. Das ist Grundwissen.



  • pumuckl schrieb:

    duckman schrieb:

    Reicht es also, wenn ich CKonto als eigenständige Klasse erstelle und sie im HEader vor CKontoverwaltung setze? Könnte ich dir Pointer dann auf diese Art erzeugen?

    Könntest du nur, wenn CKonto nicht mehr von CKontoverwaltung ableitet. Du musst es aber nicht so machen.

    Ich kann mich nur wiederholen: google mal nach forward declaration. Das ist Grundwissen.

    Forward Declaration habe ich mir jetzt angeschaut, ist ja wirklich ein ganz simple Sache.
    Dennoch glaube ich inzwischen selbst, dass eine eigene Klasse hier mehr Sinn macht.

    Jetzt stehe ich jedoch vor einem neuen Problem in der ErstelleKonto

    void CKontoverwaltung::ErstelleKonto(char Kontonummer)
    {
    	pKonto[Kontonummer]= new CKonto(); 
    	m_cAnzahlkonten++; 
    }
    

    Ich möchte z.B. aus dem vorhin erstellten Array auf pKonto [1] oder pKonto[5] oder... zugreifen.
    Allerdings gibt der Compiler folgende Fehlermeldung dazu aus:

    Fehler 1 error C2440: '=': 'CKonto *' kann nicht in 'CKonto [10]' konvertiert werde

    Wie kann ich das lösen?

    Im Prinzip geht es mir nur um folgendes: Ich möchte Objekte/Pointer auf diese mit dynamischen Namen erstellen, so dass ich vernünftig auf sie zugreifen kann. Sprich Pointer1, Pointer2 usw. wären ideal.
    Mir ist nur bisher kein anderes Hilfsmittel als jenes Array eingefallen.



  • Dazu bräuchtest du ein Array aus Pointern auf CKonto.
    Der new-Operator gibt die Addresse des allokierten Speichers zurück.
    Du köntest ja auf die einzelnen Member zugreifen und entsprechend zuweisen.
    Ich würde dir allerdings empfehlen, dich mal nach std::list umzusehen (Kannst ja auch ne Liste selbst implementieren, kann auch ganz interessant sein.).



  • duckman schrieb:

    Fehler 1 error C2440: '=': 'CKonto *' kann nicht in 'CKonto [10]' konvertiert werde

    Wie kann ich das lösen?

    Das hier ist noch ein Beispiel wie das ganze aussieht im Bezug auf meinen Vorposter.

    char a[10];
    a[10]=char;
    a=char*;
    a[10]=new char[10];//nein, da jeder Platz im Array ein char ist
    
    char* b[10];
    b[10]=char*;
    b=char**;
    b[10]=new char[10];//ja weil jeder Platz im Array ein Zeiger auf char ist und damit die Adresse speichern kann
    

    Beim Gebrauch eines Arrays von Zeigern ist aber vorsicht geboten da man jedes Arrayfeld einzelln deleten muß bevor man das eigentliche Array deleten kann.


Anmelden zum Antworten