Polaris
Experte
(offline)
Dabei seit 07.2006
1766
Beiträge
|
|
Geschrieben am: 04.04.2007 um 15:36 Uhr
|
|
Zitat von Rifleman: Zitat von Polaris: mach ne Membervariable m_Blockgroesse, weise dieser beim Konstruktoraufruf Blockgroesse zu und ändere in meinem Code Blockgroesse in m_Blockgroesse um
Mit "anpassen" meinte ich auch m_Groesse += Blockgroesse. Das feht.
oh klar, hab ich vergessen
Kommt davon, wenn man den Code selber nicht mitgeschrieben hat -.-.
Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)
|
|
Polaris
Experte
(offline)
Dabei seit 07.2006
1766
Beiträge
|
|
Geschrieben am: 04.04.2007 um 15:39 Uhr
|
|
So dürft's passen, oder?
void CIntArray::AriseArray(int _Blockgroesse) {
int* _Temp = new int[m_Groesse + _Blockgroesse];
memset(_Temp, 0, sizeof(int) * (m_Groesse + _Blockgroesse));
memcpy(_Temp, m_pData, sizeof(int) * m_Groesse);
delete[] m_pData;
m_pData = _Temp;
m_Groesse += Blockgroesse;
}
Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)
|
|
Rifleman - 40
Experte
(offline)
Dabei seit 09.2003
1540
Beiträge
|
|
Geschrieben am: 04.04.2007 um 16:01 Uhr
|
|
Zitat von Polaris: void CIntArray::AriseArray(int _Blockgroesse) {
int* _Temp = new int[m_Groesse + _Blockgroesse];
memset(_Temp, 0, sizeof(int) * (m_Groesse + _Blockgroesse));
memcpy(_Temp, m_pData, sizeof(int) * m_Groesse);
delete[] m_pData;
m_pData = _Temp;
m_Groesse += Blockgroesse;
}
Vom Prinzip ist das ja genau richtig, wenn du unbedingt die Blockgröße als Parameter haben willst.
Dann muss es unten aber auch _Blockgroesse und nicht Blockgroesse heissen, weil bei dieser Lösung die beiden nicht zwingend gleich sein müssen, da immer erst beim Call geprüft wird...
Es sind die kleinen Dinge, die einen zum Wahnsinn treiben.
|
|
Polaris
Experte
(offline)
Dabei seit 07.2006
1766
Beiträge
|
Geschrieben am: 04.04.2007 um 16:23 Uhr
Zuletzt editiert am: 04.04.2007 um 16:24 Uhr
|
|
Zitat von Rifleman: Zitat von Polaris: void CIntArray::AriseArray(int _Blockgroesse) {
int* _Temp = new int[m_Groesse + _Blockgroesse];
memset(_Temp, 0, sizeof(int) * (m_Groesse + _Blockgroesse));
memcpy(_Temp, m_pData, sizeof(int) * m_Groesse);
delete[] m_pData;
m_pData = _Temp;
m_Groesse += Blockgroesse;
}
Vom Prinzip ist das ja genau richtig, wenn du unbedingt die Blockgröße als Parameter haben willst.
Dann muss es unten aber auch _Blockgroesse und nicht Blockgroesse heissen, weil bei dieser Lösung die beiden nicht zwingend gleich sein müssen, da immer erst beim Call geprüft wird...
richtig , vllt. sollte ich mich schlafen legen, so konzentriert wie ich gerade bin
Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)
|
|
-mOsTwAnTeD- - 35
Profi
(offline)
Dabei seit 07.2006
677
Beiträge
|
|
Geschrieben am: 05.04.2007 um 07:53 Uhr
|
|
Okey danke,
Aber wie muss der Copy Konstruktor aussehen?
Ich scheiß auf deine Welt voller Arroganz und Geld!
|
|
Polaris
Experte
(offline)
Dabei seit 07.2006
1766
Beiträge
|
Geschrieben am: 05.04.2007 um 09:02 Uhr
Zuletzt editiert am: 05.04.2007 um 09:07 Uhr
|
|
Ganz allgemein so:
Klassenname::Klassenname(const Klassenname& co) {
// Attributwerte kopieren
Attribut1 = co.Attribut1;
}
ein Konstruktor, dem du eine const-Referenz auf ein Objekt deiner Klasse übergibst ...
du musst also bei dir in die Werte der neu zu konstruierenden Instanz von CIntArray die Werte der übergebenen Referenz kopieren
Ein Copykonstruktoraufruf sieht so aus:
// ....
CIntArray A(5,4);
A.Add(2);
A.Add(3);
CIntArray B(A); // Kopierkonstruktoraufruf ==> B soll den gleichen Inhalt wie A haben
// ....
Bei dir sind das dann (wenn ich nix vergessen habe):
int* m_pData
int m_Groesse
int m_Zaehler
int m_Blockgroesse (je nach deiner Schreibweise)
Probier mal aus, wie weit du dabei kommst.
Bei weiteren Fragen wird umgehend geholfen .
Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)
|
|
-mOsTwAnTeD- - 35
Profi
(offline)
Dabei seit 07.2006
677
Beiträge
|
|
Geschrieben am: 05.04.2007 um 11:11 Uhr
|
|
Zitat von Polaris: Ganz allgemein so:
Klassenname::Klassenname(const Klassenname& co) {
// Attributwerte kopieren
Attribut1 = co.Attribut1;
}
ein Konstruktor, dem du eine const-Referenz auf ein Objekt deiner Klasse übergibst ...
du musst also bei dir in die Werte der neu zu konstruierenden Instanz von CIntArray die Werte der übergebenen Referenz kopieren
Ein Copykonstruktoraufruf sieht so aus:
// ....
CIntArray A(5,4);
A.Add(2);
A.Add(3);
CIntArray B(A); // Kopierkonstruktoraufruf ==> B soll den gleichen Inhalt wie A haben
// ....
Bei dir sind das dann (wenn ich nix vergessen habe):
int* m_pData
int m_Groesse
int m_Zaehler
int m_Blockgroesse (je nach deiner Schreibweise)
Probier mal aus, wie weit du dabei kommst.
Bei weiteren Fragen wird umgehend geholfen  .
Hilfe Support Center 
Das mit dem Kopykonstruktor ist soweit klar aber wann und von wo aus muss ich diesen aufrufen?
Ich scheiß auf deine Welt voller Arroganz und Geld!
|
|
Rifleman - 40
Experte
(offline)
Dabei seit 09.2003
1540
Beiträge
|
Geschrieben am: 05.04.2007 um 11:40 Uhr
Zuletzt editiert am: 05.04.2007 um 11:44 Uhr
|
|
Zitat von Polaris: Klassenname::Klassenname(const Klassenname& co) {
// Attributwerte kopieren
Attribut1 = co.Attribut1;
}
Bei dir sind das dann (wenn ich nix vergessen habe):
int* m_pData
int m_Groesse
int m_Zaehler
int m_Blockgroesse (je nach deiner Schreibweise)
Der int* muss aber speziell behnadelt werden. Deswegen der Aufstand.
Also etwa so:
CIntArray::CIntArray(const CIntArray& co)
: m_Groesse(co.m_Groesse), m_Blockgroesse(co.m_Blockgroesse), m_Zaehler(co.m_Zaehler)
{
//int* m_pData darf nicht so initialisiert werden (shallow-copy!)
m_pData = new int[m_Groesse];
memcpy(m_pData, co.m_pData, m_Groesse*sizeof(int) );
}
/edit: evtl sind dicke Schnitzer im Code...also lesen und nicht copy&paste.
Ach ja...der Code ist aus purer Faulheit bei Polaris abgekuckt...
Es sind die kleinen Dinge, die einen zum Wahnsinn treiben.
|
|
-mOsTwAnTeD- - 35
Profi
(offline)
Dabei seit 07.2006
677
Beiträge
|
|
Geschrieben am: 05.04.2007 um 12:13 Uhr
|
|
Zitat von Rifleman: Zitat von Polaris: Klassenname::Klassenname(const Klassenname& co) {
// Attributwerte kopieren
Attribut1 = co.Attribut1;
}
Bei dir sind das dann (wenn ich nix vergessen habe):
int* m_pData
int m_Groesse
int m_Zaehler
int m_Blockgroesse (je nach deiner Schreibweise)
Der int* muss aber speziell behnadelt werden. Deswegen der Aufstand.
Also etwa so:
CIntArray::CIntArray(const CIntArray& co)
: m_Groesse(co.m_Groesse), m_Blockgroesse(co.m_Blockgroesse), m_Zaehler(co.m_Zaehler)
{
//int* m_pData darf nicht so initialisiert werden (shallow-copy!)
m_pData = new int[m_Groesse];
memcpy(m_pData, co.m_pData, m_Groesse*sizeof(int) );
}
/edit: evtl sind dicke Schnitzer im Code...also lesen und nicht copy&paste.
Ach ja...der Code ist aus purer Faulheit bei Polaris abgekuckt...
aber von wo aus muss ich den aufrufen?
Ich scheiß auf deine Welt voller Arroganz und Geld!
|
|
Rifleman - 40
Experte
(offline)
Dabei seit 09.2003
1540
Beiträge
|
Geschrieben am: 05.04.2007 um 12:24 Uhr
Zuletzt editiert am: 05.04.2007 um 12:25 Uhr
|
|
Zitat von -mOsTwAnTeD-: aber von wo aus muss ich den aufrufen?
Von wo du willst. Immer dann, wenn du von einem Objekt eine identische Kopie erzeugen willst.
Noch eine Anmerkung:
Vielleicht wäre es besser, statt "new int[m_Groesse]" "new int[co.m_Groesse]" zu schreiben, um anzuzeigen, dass das ein gleich großer Array sein soll und wir da keinen Unfug machen....
Es sind die kleinen Dinge, die einen zum Wahnsinn treiben.
|
|
Polaris
Experte
(offline)
Dabei seit 07.2006
1766
Beiträge
|
|
Geschrieben am: 05.04.2007 um 12:53 Uhr
|
|
Zitat von Rifleman: Zitat von Polaris: Klassenname::Klassenname(const Klassenname& co) {
// Attributwerte kopieren
Attribut1 = co.Attribut1;
}
Bei dir sind das dann (wenn ich nix vergessen habe):
int* m_pData
int m_Groesse
int m_Zaehler
int m_Blockgroesse (je nach deiner Schreibweise)
Der int* muss aber speziell behnadelt werden. Deswegen der Aufstand.
Also etwa so:
CIntArray::CIntArray(const CIntArray& co)
: m_Groesse(co.m_Groesse), m_Blockgroesse(co.m_Blockgroesse), m_Zaehler(co.m_Zaehler)
{
//int* m_pData darf nicht so initialisiert werden (shallow-copy!)
m_pData = new int[m_Groesse];
memcpy(m_pData, co.m_pData, m_Groesse*sizeof(int) );
}
/edit: evtl sind dicke Schnitzer im Code...also lesen und nicht copy&paste.
Ach ja...der Code ist aus purer Faulheit bei Polaris abgekuckt...
natürlich muss das gesondert behandelt werden, das sollte er aber selber herausfinden und net du ihm dem ganzen Code schreiben 
dürfte eigtl. stimmen, muss man halt mal ausprobieren ; sitz aber leider gerade an nem uralten PC auf dem nix installiert ist, muss mal gucken, ob VC++ 6 drauf läuft (wobei, bevor ich diesen Scheiß installiere, mach ich mich lieber auf die Suche nach meiner BCB 5 CD)
Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)
|
|
Rifleman - 40
Experte
(offline)
Dabei seit 09.2003
1540
Beiträge
|
|
Geschrieben am: 05.04.2007 um 12:57 Uhr
|
|
Zitat von Polaris: natürlich muss das gesondert behandelt werden, das sollte er aber selber herausfinden und net du ihm dem ganzen Code schreiben 
Er braucht ja immer noch den entsprechenden destructor und den =....
Es sind die kleinen Dinge, die einen zum Wahnsinn treiben.
|
|
-mOsTwAnTeD- - 35
Profi
(offline)
Dabei seit 07.2006
677
Beiträge
|
|
Geschrieben am: 05.04.2007 um 13:37 Uhr
|
|
Zitat von Rifleman: Zitat von Polaris: natürlich muss das gesondert behandelt werden, das sollte er aber selber herausfinden und net du ihm dem ganzen Code schreiben 
Er braucht ja immer noch den entsprechenden destructor und den =....
also bevor ich eure code schnipsel verwendet habe hat das Programm funktioniert und jetzt... 
Es läuft eigentlich schon aber....
...Jetzt wird jedesmal wenn das Array vergrößert wird die Zahl durch 0 ersetzt
Ich scheiß auf deine Welt voller Arroganz und Geld!
|
|
Rifleman - 40
Experte
(offline)
Dabei seit 09.2003
1540
Beiträge
|
Geschrieben am: 05.04.2007 um 13:38 Uhr
Zuletzt editiert am: 05.04.2007 um 13:42 Uhr
|
|
Zitat von -mOsTwAnTeD-: ...Jetzt wird jedesmal wenn das Array vergrößert wird die Zahl durch 0 ersetzt
Was genau wird ersetzt?
Und den Code, der das tut sollte man auch sehen...
Es sind die kleinen Dinge, die einen zum Wahnsinn treiben.
|
|
-mOsTwAnTeD- - 35
Profi
(offline)
Dabei seit 07.2006
677
Beiträge
|
Geschrieben am: 05.04.2007 um 13:54 Uhr
Zuletzt editiert am: 05.04.2007 um 13:57 Uhr
|
|
int CIntArray::AriseArray(int _Blockgroesse) {
int* _Temp = new int[m_Groesse + _Blockgroesse];
memset(_Temp, 0, sizeof(int) * (m_Groesse + _Blockgroesse));
memcpy(_Temp, m_pData, sizeof(int) * m_Groesse);
delete[] m_pData;
m_pData = _Temp;
m_Groesse += _Blockgroesse;
return 0;
}
hier wird doch auch eine Kopie des Array erstellt oder nicht
Vielleicht ist das mein Fehler
//EDIT: Wenn ich mit dem Copykonstruktor arbeite brauch ich diese methode dann auch?
Ich scheiß auf deine Welt voller Arroganz und Geld!
|
|