Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Objekte von Klassen dynamisch erzeugen?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
31.12.2003, 13:53 Uhr
~RIP
Gast


Ich brauche für eine 3D-Engine dynamische Vektoren und son' Zeugs - ich weiß aber nicht wie man das macht. Ich habe mal was geschrieben - so stelle ich mir das ungefähr vor - funktioniert nur nicht. HILFE!! (:surrender


C++:
#include "stdafx.h"
#include <stdio.h>

int bereits_vorhandene_Punkte=0;

class Testpunkt
{
    public:
        Testpunkt(double,double,double);
        void zeigKoord()
        {
            printf("%fx %fy %fz\n",x,y,z);
        }
    private:
        double x;
        double y;
        double z;
};

// Konstruktor
Testpunkt :: Testpunkt(double _x, double _y, double _z)
{
    x=_x;
    y=_y;
    z=_z;
}

// Objekt von Klasse ableiten
Testpunkt Punkt1(1,2,3);

void neuerPunkt()
{
    new Testpunkt Punkt[bereits_vorhandene_Punkte](1,1,1);
    bereits_vorhandene_Punkte++;
}

void killPunkte()
{
    for (int loop=    bereits_vorhandene_Punkte;loop>-1;loop--)
    {
        delete Testpunkt Punkt[bereits_vorhandene_Punkte];
    }
}

int main()
{
    Punkt1.zeigKoord();
    neuerPunkt();
    neuerPunkt();
    killPunkt();
    return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
31.12.2003, 18:36 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ich kenn mich zwar mit dem opengl krempel nicht aus....

also es gibt mehrere möglichkeiten wie du das realisieren könntest.

zb.: du verwendest eine Containerklasse aus der STL. z.b. std::vector
die nimmt dir die ganze speicherverwaltung ab und du musst nicht neuen speicher allokieren sondern das macht der STL-container automatisch....

du schreibst dir eine neue Klasse bei der ein Member ein array von objekten deiner Testpunkt klasse ist und allokierst ständig speicher nach wenn du mehr brauchst...

oder du verwendest eine liste.....

am einfachsten ist es vermutlich mit einem std::vector
verwende mal die forumssuche da gibt es massenweise beispiele dazu wie das zu verwenden ist....


nun mal zu dem was du gemacht hast...

C++:
#include "stdafx.h"
#include <stdio.h>

int bereits_vorhandene_Punkte=0;// globale variablen sind imemr schlecht du könntest z.b. eine static variable in deiner klasse verwenden oder du machst halt eine neue klasse in der sich ein testpunkt-array befindet....

class Testpunkt
{
    public:
        Testpunkt(double,double,double);
        void zeigKoord()
        {
            printf("%fx %fy %fz\n",x,y,z);
        }
    private:
        double x;
        double y;
        double z;
};

// Konstruktor

Testpunkt :: Testpunkt(double _x, double _y, double _z)
{
    x=_x;
    y=_y;
    z=_z;
}

// es ist nicht nötig unterstriche zu verwenden.... du kannst das auch so machen
Testpunkt :: Testpunkt(double x, double y, double z)
{
    this->x=x;   /this liefert dir einen zeiger auf das object
    this->y=y;
    this->z=z;
}


// Objekt von Klasse ableiten
Testpunkt Punkt1(1,2,3);

void neuerPunkt()
{
    //das geht so gar nicht.....gaaaaaaaaaanz übel und du kannst bei new auch nicht gleichzeitig ein konstruktor mitverwenden, dann müsstest du ein doppelpointerarray verwenden....
    new Testpunkt Punkt[bereits_vorhandene_Punkte](1,1,1);
    bereits_vorhandene_Punkte++;
}

//auch übel wie bei neuer punkt
void killPunkte()
{
    for (int loop=    bereits_vorhandene_Punkte;loop>-1;loop--)
    {
        delete Testpunkt Punkt[bereits_vorhandene_Punkte];
    }
}

int main()
{
    Punkt1.zeigKoord();
    neuerPunkt();
    neuerPunkt();
    killPunkt();
    return 0;
}





also fazit wenn du dich nicht mit dem speicherallokieren rumärgern willst nimm einen std::vector....
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.01.2004, 12:31 Uhr
~RIP
Gast


Also eigentlich will ich mich noch ein bisschen mit dem "speicherallokieren rumärgern" - nur um das endlich mal richtig zu lernen. Deswegen kein STL. :-) ...

Du sagts das würde mit einem doppelpointerarray funktionieren - kannst du mir mal einen Beispielcode dazu geben?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.01.2004, 16:21 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ok also um nochmal zu erklären was das problem ist....

angenommen du willst ein int-array dynamisch erstellen

C++:
int *myintarray;
myintarray= new int[100];  //oder wie gross auch immer

//mit dem array arbeiten

//spreicher wieder freigeben
delete [] myintarray;




so jetzt hast du folgendes Problem

C++:
Testpunkt *myTestpunkt;
myTestpunkt = new myTestpunkt[100](1,1,1);// das hier geht nicht.....



wenn man sich beschissen viel aufwand machen will könnten man das z.b. so lösen

C++:
Testpunkt **myTestpunkt;
int i;
myTestpunkt = new myTestpunkt*[100];//eine zeigerarray aus 100 zeigern...
for(i=0;i<100;++i) myTestpunkt[i] = new Testpunkt(1,1,1);

//mit dem Krempel arbeiten
//zugriffe auf die members dann nicht wie gewohnt mit dem . sondern mit ->
//also z.b.  myTestpunkt[3]->zeigKoord();

//am ende nicht vergessen speicher wieder freizugeben....
for(i=0;i<100;++i) delete myTestpunkt[i];
delete [] myTestpunkt;



das problem das allerdings bleibt ist das du ja beliebig viele punkte hinzufügen willst... das ist allerdings ein problem was dir die stl-hervorrangend abnimmt..

um das problem nochmal an dem intarray-beispiel zu demonstrieren

C++:
int *myintarray;
myintarray= new int[100];  //oder wie gross auch immer

//jetzt arbeitest du mit dem array und stellst fest das der speicher von 100 nicht reicht

myintarray= new int[200];  //das hier darfst du auf keine fall machen also vergiss die zeile schnell wieder... wenn du es so machst wird neuer speicher angefordert und der alte hängt "verlorgen rum"

//lösen könntest du das Problem z.b. so
int *tempbuffer=new int[200];//neuen buffer anlegen
memcpy(tempbuffer,myintarray,100*sizeof(int));//speicher inhalt des alten kopieren... wenn du dies nicht machst sind die alten werte alle verloren...
delete [] myintarray;// alten speicher wieder freigeben
myintarray=temp; // myintarray auf den neuen speicher zeigen lassen....

//mit dem neuen array weiterarbeiten

//am ende das freigeben nicht vergessen
delete [] myintarray;




das ganze müsstest du jetzt für ein doppelpointerarray machen


C++:
int i;
Testpunkt **myTestpunkt;
myTestpunkt = new myTestpunkt*[100];//eine zeigerarray aus 100 zeigern...
for(i=0;i<100;++i) myTestpunkt[i] = new Testpunkt(1,1,1);

//hier stell ich fest das 100 nicht mehr reicht und allokieren neuen speicher
Testpunkt **temp;
temp= new myTestpunkt*[200]; //grösseres Pointerarray allokieren
for(i=0;i<100;++i) temp[i]=myTestpunkt[i];// hier müssen nur die zeiger "kopiert" werden nicht die objekte selbst...
delete [] myTestpunkt;
myTestpunkt=temp;

//am ende nicht vergessen speicher wieder freizugeben....
for(i=0;i<100;++i) delete myTestpunkt[i];
delete [] myTestpunkt;



was du dir noch angucken könntest wäre das xed-projekt von virtual
schau mal in die Projekte-Ecke. Da ist ein Hexeditorprojekt von virtual drinne.. Lad dir da mal den aktuellen quellcode runter.. da wird genau diese problematik des nachallokieren behandelt allerdings in c und nicht in c++... es wird also malloc und free statt new und delete verwendet...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.01.2004, 16:28 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Wie wärs wenn er einfach einen Konstruktor mit () hinzufügt, in der die Variablen standardmäßig mit 1,1,1 initialisiert werden:


C++:
class Testpunkt
{
    public:
        Testpunkt()
        {
           x = y = z = 1;
        }
        void Set(double _x, double _y, double _z)
        {
           x = _x; y = _y; z = _z;
        }
        void zeigKoord()
        {
            printf("%fx %fy %fz\n",x,y,z);
        }
    private:
        double x;
        double y;
        double z;
};



dann funktioniert nämlich


C++:
Testpunkt *myTestpunkt = new myTestpunkt[100];

//...

delete[] myTestpunkt;


--
class God : public ChuckNorris { };

Dieser Post wurde am 01.01.2004 um 16:29 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.01.2004, 16:31 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Flo
die frage ist ob der das so standardmässig machen will...
war ja nur ein einfaches beispiel das der gepostet hat...
"normalerweise" ruft man bei sowas ja nicht meist den defaultkonstruktor auf....
und ein weitere vorteil ist das man nur mit pointern arbeitet und auch nur diese kopiert... an sonsten müssten ja immer alle objekte kopiert werden.. der absolute performancekiller. Und RIP steht auf performance wie du weisst...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 01.01.2004 um 16:32 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: