Array und Klassen
-
Die aktuelle Anzahl hast du ja vorher schon gespeichert, bei dir
m_iAnzahlgenannt.Angemerkt sei noch: Es ist unmöglich, bei einem Zeiger auf ein Array die Anzahl der Elemente im Array rauszufinden, deshalb muss man sich die Anzahl bei dynamischen Arrays immer irgendwo abspeichern.
-
Ne, hab ich nicht, diese Var ist noch nicht initialisiert
-
franz-21 schrieb:
Ne, hab ich nicht, diese Var ist noch nicht initialisiert
Dafür wurden Konstruktoren erfunden. Beim Erzeugen von
Vereinsetzt du den Wert auf 0. Du musst beim add() natürlich nochmal aufpassen, wenn du das alte Array löscht, ob es überhaupt schon vorhanden war.
-
Oh Mann, ich glaube ich gehe lieber ins Bett, so einen blödsinn zu programmieren
Aber Danke, hat mich weitergebracht!
-
Speicherst du das nicht in m_iAnzahl ?
Einfach eine Variable zu pro "Add" eins größer wird.
Noch was, musst du nicht aufpassen, dass der Destruktur aufgerufen wird ? Bei der Zuweisung (vorausgesetzt der Operator = ist nicht überladen) dürfte nur die Adresse kopiert werden...
void add() { CMitglieder temp; m_Array[num]=temp; } //Wird hier nicht der Destruktor von m aufgerufen ?
-
DarkShadow44 schrieb:
Bei der Zuweisung (vorausgesetzt der Operator = ist nicht überladen) dürfte nur die Adresse kopiert werden...
Der Threadersteller sollte wohl besser ohnehin einen eigenen Kopierkonstruktor, Zuweisungsoperator und Destruktor schreiben, sonst birgt seine Klasse reichlich Fehlerpotential für den Benutzer.
-
Würden die Objekte jetzt zerstört ?
Dei der Übergabe mitvoid add(CMitglieder m) { //... }sollte es eigentlich auch Probleme geben...
-
hab hier mal ein bisschen Code
using namespace std; class CVerein{ private: CMitglieder *pMitglieder; int m_iAnzahl; public: void add(); CVerein(); }; void CVerein::add(){ m_iAnzahl++; pMitglieder=new CMitglieder[m_iAnzahl]; for(int i=0; i<m_iAnzahl; i++){ pMitglieder[i]= keine Ahnung } delete[] pMitglieder; pMitglieder=NULL; } CVerein::CVerein(){ CMitglieder *pMitglieder=NULL; m_iAnzahl=0; }Kann mir wer zeigen wie das mit den kopieren und den Zeiger neu setzten geht?
-
NULL-Pointer dürfen in C++ gelöscht werden.
class CVerein{ private: CMitglieder* (*pMitglieder); int m_iAnzahl; public: void add(); CVerein(); }; void CVerein::add(CMitglieder*m){ CMitglieder* (*pMitgliederTemp)=new CMitglieder*[m_iAnzahl]; int i; for(i=0;i<m_iAnzahl;i++) { pMitgliederTemp[i]=pMitglieder[i]; } delete[] pMitglieder; m_iAnzahl++; pMitglieder=new CMitglieder*[m_iAnzahl]; for(i=0; i<m_iAnzahl-1; i++){ pMitglieder[i]= pMitgliederTemp[i]; } pMitglieder[i]=m; delete[] pMitgliederTemp; } CVerein::CVerein(){ pMitglieder=NULL; m_iAnzahl=0; }So ungefähr würde ich das machen...
Probleme:
- 1. Mitglied, reservierter Speicher 0, ich weiß nicht ob das Probleme gibt, aber das must du lösen :p
-
thx für das Listining!
Was ist das für eine Schreibweise CMitglieder* (*pMitglieder);? Habe ich noch nie gesehen. Pointer Pointer??

Bedeutet das hier, pMitglieder=new CMitglieder*[m_iAnzahl]; oder void CVerein::add(CMitglieder *Mitglied), ein Pointer erwartet wird?
-
Ja, das ist ein Array aus Pointern (zumindest mache ich das immer so)

Bedeutet das hier, pMitglieder=new CMitglieder*[m_iAnzahl]; oder void CVerein::add(CMitglieder *Mitglied), ein Pointer erwartet wird?
Genau. Der Funktion "add" wird ein Pointer übergeben, um das Problem mit dem Destruktor zu lösen; und dieser Pointer wird in dem Array gespeichert.
Die Objekte legst du dann so an:
CVerein verein; CMitglieder* MitgliedNr1 = new CMitglieder(); CMitglieder* MitgliedNr2 = new CMitglieder(); verein.add(MitgliedNr1); verein.add(MitgliedNr2);
-
@DarkShadow44,
1. Wozu diese Klammern? Die sind völlig unnötig.
2. Dein präsentierter Code erfüllt die Aufgabenstellung nicht mehr. Es steht explizit, dass Objekte von Mitglieder gespeichert werden müssen und nicht Zeiger davon. Zudem soll das übergebene Objekt ans Ende des Array kopiert werden und nicht ein Zeiger darauf gespeichert.
3. Bitte Intialisierungslisten im Konstruktor verwenden.
4. Du brauchst ein unnötiges temporäres Array zuviel.
5. Dein Vorgehen ist sehr verwirrend für jeden, welcher die Klasse verwenden würde, da die Besitztverhältnisse nicht klar sind. Verein ist eine Art von Containerklasse, verhält sich aber überhaupt nicht so, was die Besitzverhältnisse betrifft.@franz-21,
Die grundsätzliche Vorgehensweise über das temporäre Array, wie es Darkshadow44 gemacht hat, ist schon korrekt. Aber naja, es stimmt einiges anderes überhaupt nicht.class Verein { private: Mitglied* m_mitglieder; int m_anzahl; public: Verein(); ~Verein(); void add(Mitglied const& mitglied); }; Verein::Verein() : m_mitglieder(NULL) , m_anzahl(0) { } Verein::~Verein() { delete[] m_mitglieder; } void Verein::add(Mitglied const& mitglied) { Mitglied* altMitglieder = m_mitglieder; m_mitglieder = new Mitglied[m_anzahl + 1]; for(int i = 0; i < m_anzahl; ++i) { m_mitglieder[i] = altMitglieder[i]; } m_mitglieder[m_anzahl] = mitglied; ++m_anzahl; delete[] altMitglieder; }Damit die Klasse
Vereinnoch sinnvoll verwendet werden kann, musst du noch einen Zuweisungsoperator und den Kopierkonstruktor dafür schreiben.Grüssli
-
Hab jetzt nocheinmal im Buch zurückgeblättert und finde nichts zu Zuweisungsoperatoren. Habe mir einen gegoogelt, nur wie ist der zu interpretieren?
void operator=(const Vector &derAndereVector) //für was steht operator= ? { delete[] m_data; m_size=derAndereVector.m_size; m_data=new double[m_size]; for(int i=0;i<m_size;++i) m_data[i]=derAndereVector.m_data[i]; };
-
Überladung von Operatoren in C++
Grüssli
-
Der wird aufgerufen bei
Vector a; Vector b; //tuwas b=a;//<--Hier
-
1. Wozu diese Klammern? Die sind völlig unnötig.
Ups. Keine Ahnung warums vorhin ohne nicht ging

Dein präsentierter Code erfüllt die Aufgabenstellung nicht mehr. Es steht explizit, dass Objekte von Mitglieder gespeichert werden müssen und nicht Zeiger davon. Zudem soll das übergebene Objekt ans Ende des Array kopiert werden und nicht ein Zeiger darauf gespeichert.
Sorry, habe ich überlesen.
3. Bitte Intialisierungslisten im Konstruktor verwenden.
Warum ? Die Anzahl muss 0 werden und der Pointer NULL.
4. Du brauchst ein unnötiges temporäres Array zuviel.
Da denke ich zu kompliziert

Verein ist eine Art von Containerklasse, verhält sich aber überhaupt nicht so, was die Besitzverhältnisse betrifft.
Wie meinst du das ?
-
Wie würde den so ein Zuweisungsoperator für mein Beispiel aussehen, oder kann mir wer eine gutes Tutorial empfehlen? Kappier das noch nicht ganz
-
Dravere schrieb:
Überladung von Operatoren in C++
Grüssli
-
Ich mein mit Übungen, das ist ein Bisschen trocken
-
Was für Übungen? - Da hats Beispielcode. Reicht dir das nicht?