Kindklassenobjekt in Elternklasse erstellen - möglich?
-
Hallo,
ich bearbeite derzeit eine Aufgabe in C++.
Für meine Realisierung müsste ich innerhalb der Elternklasse ein Pointerarray mit 10 Inhalten vom Typ einer Kindklasse erstellen.Das ganze sieht im Moment so aus:
CKonto (*pKonto)[10];Und befindet sich im public: Bereich der Elternklasse (von CKonto).
Leider explodiert der Compiler förmlich mit 6 Fehlermeldungen zur betroffenen Zeile (MS Visual Studio 2008)
Fehler 1 error C2059: Syntaxfehler: ''
Fehler 2 error C2090: Funktionsergebnis ist ein Array
Fehler 3 error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
Fehler 5 error C2059: Syntaxfehler: ''
Fehler 6 error C2090: Funktionsergebnis ist ein Array
Fehler 7 error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.Hat jemand eventuell eine Idee, wo der Fehler liegen könnte?
-
Das sieht mir nach einer Virusprogrammierung aus.
Bitte nicht helfen.
-
Ja genau und deinen PC befällt er als ersten, weil du auf meinen Post geantwortet hast.

Im Ernst, mein Projekt hat ganz und gar nichts mit einem Virus zu tun. Wenn ich einen programmieren wöllte, würde ich sicher genug Know-how besitzen um ohne ein Forum klarzukommen. Geschweige denn würde ich solche Anfängerfragen stellen.
-
Inzwischen habe ich mich auch registriert.
Also um es noch einmal klarzustellen: Das soll definitiv kein Virus werden, ich habe auch ohne solche anspruchsvollen Aufgaben noch genügend Probleme mit C++.
-
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 kannBeim Gebrauch eines Arrays von Zeigern ist aber vorsicht geboten da man jedes Arrayfeld einzelln deleten muß bevor man das eigentliche Array deleten kann.