member Variable Konstraktor

kerian

Erfahrenes Mitglied
member Variable Konstruktor

Wie kann ich auf eine memeber Variable zugreifen
ohne ein Objekt zu erzeugen. Oder geht das nicht?
Weil wenn ich im Konstruktor Variablen definiere
und in einem Dialog schon ein Objekt erzeugt habe,
und ich erneut ein Objekt erzeuge, werden dann die
Varaiblen wieder neu initialisiert!:rolleyes:
 
Zuletzt bearbeitet:
Öhm wenn ich dich richtig verstanden habe....geht das nicht.
Du kannst ja nicht auf eine Variable zugreifen, die noch nicht
existiert, aber du könntet die doch global initialisieren,oder?
 
Habe mir ein Beispiel (Ringpuffer) als Klasse abgetippt.
Funktioniert auch. Will ich jetzt auf die Methode GetCount()
zugreiffen. Habe eine Instanz erzeugt und den Counter ausgelesen.
Bemerkte, dass er immer auf Null stand. Ist ja auch klar in dem
Konstruktor wird der Counter auf Count = 0; gesetzt !
 
Dann mach dir doch ne statische Varibale, die dann durch den Konstruktor immer um eins erhöht wird.
Ich hoffe ich versteh dich richtig...
 
Ich denke nicht ganz. Das sind die drei Methoden für mein Counter

void CFifo::Push(PPaket PaketPtr)
{
if (!Full())
{ memcpy(&Paket[WritePtr],PaketPtr,PaketLength);
Count++;
WritePtr++;
if (WritePtr==FIFO_LENGHT) WritePtr=0;
}

}
void CFifo::Pop(PPaket PaketPtr)
{
if (!Empty())
{memcpy(PaketPtr,&Paket[ReadPtr],PaketLength);
Count--;
ReadPtr++;
if (ReadPtr==FIFO_LENGHT) ReadPtr=0;
}
}
WORD CFifo::GetCount()
{
return(Count);
}

Wenn ich jetzt in einem Dialog ein Objekt erstelle läuft der Ringpuffer dann.
Nun möchte ich aus einem anderen Dialog auf die Methode GetCounter zugreiffen
ohne eine neue Instanz zu erzeugen weil dann mein Rrinpuffer neu Initialisiert wird und somit der Konstruktor meiner FIFO Klasse neu ausgeführt wird und alle Werte auf Null gesetzt werden:rolleyes: CFifo::CFifo()
CFifo::CFifo()
{
Count=0;
ReadPtr=0;
WritePtr=0;
PaketLength=sizeof(TPaketTyp);
Paket=(PPaket)malloc(FIFO_LENGHT*sizeof(TPaketTyp));
if (!Paket)
{
// wnd.MessageBox("nicht genügend Speicher",NULL ,MB_OK|MB_ICONEXCLAMATION);
exit(0);
}
}


Ich habe noch eine andere Schwirigkeit. Kannst du mir mal das mit dem
"Zeiger auf ein Feld mit den Elementen TPaketTyp dynamisch reserviert"
erklären!
typedef WORD TPaketTyp // Art des Paketes im Fifo
typedef TPaketTyp *PPaket;
#define FIFO_LENGHT 1000

class CFifo
{

WORD PaketLength; // Größe eines Paketes ´sizeof(TPaketTyp)´
public:
PPaket Paket; //Zeiger auf ein Feld mit den Elementen TPaketTyp
//dynamisch reserviert
WORD ReadPtr;
WORD WritePtr;
WORD Count;


CFifo(); // Konstruktor
~CFifo(); //Destruktor
public:
BOOL Full();
void Push(PPaket Paket);
WORD GetCount();
WORD GetReadPtr();
WORD GetWritePtr();

void Pop(PPaket Paket);
BOOL Empty();
void Clear();
};

Ich finde in den Büchern nichts dadrüber!
 
Zuletzt bearbeitet:
Mit dem Konstuktor erstellst du (in der Regel) eine neue Instanz einer Klasse.
In deinem Beispiel ist es der Fall.
Das heisst das im zweitem Dialog du eine neue Instanz von CFifo-Klasse hast und die ist natuerlich mit Count=0.

Wenn du eine einzige Ringpuffer-Instanz fuer dein Programm brauchst,
koennte man diese als eine globale Variable anlegen, auf diese koennten dann alle Dialoge zugreifen.
Die zweite Moeglichkeit waere eine Singleton-Implementation vorzunehmen.


"Zeiger auf ein Feld mit den Elementen TPaketTyp dynamisch reserviert"
dynamisch reserviert heisst das man erst im Laufe des Programms den Speicher reserviert.
Bei dir im Beispiel wird die Groesse des Feldes festlegt.
Die Anweisung die das macht ist in deinem Beispiel: malloc

Dynamisch reservierter Speicher sollte auch wieder freigegeben werden,
deswegen findest du bestimmt in dem Destructor auch die Anweisung: free
 
jo, das findet dann im Konstruktor statt richtig?
CFifo::CFifo()
{
Count=0;
ReadPtr=0;
WritePtr=0;
PaketLength=sizeof(TPaketTyp);
Paket=(PPaket)malloc(FIFO_LENGHT*sizeof(TPaketTyp));
if (!Paket)
{
// wnd.MessageBox("nicht genügend Speicher",NULL ,MB_OK|MB_ICONEXCLAMATION);
exit(0);
}

}
Aber was ich nicht ganz verstehe ist die Syntax PPaket Paket
PPaket ist der Zeiger, der dann auf den Speicher zeigt und was ist
dann Paket?
 
Aber was ich nicht ganz verstehe ist die Syntax PPaket Paket
Das ist einfach eine Variablendefinition.
PPaket ist ein Typ und Paket ist der Name der Variable von diesem Typ.
so wie
int a;
wobei PPaket an Stelle von int steht und Paket an Stelle von a.
 
Also wie ich das so verstanden habe brauchst du einen static member...

der variable/methode wird bei der deklaration der modifizierer "static" vorangestellt, dann kannst du die ohne instanz aufrufen... zu beachten ist, das statische methoden nur auf statische elemente der klasse zugreifen können, außerdem gibt es in einer statischen methode KEINEN this zeiger...

ausgerufen wird die unter verwendung des scope resolution operators...
( der :: )

also beispiel...

class abc {
public:
static int counter;
static int getSquare(int nr);
}

static int abc::counter = 0;

static int abc::getSquare(int nr) {
return (nr*nr);
}

um nur ein einfaches beispiel einer deklaration zu nennen...
nu kannst du in einer anderen funktion darauf zugreifen...
int ::main(int argc, char** argv) {
abc::counter += 5;
printf("%i", abc::getSquare(abc::counter));
return 0;
}
 

Neue Beiträge

Zurück