PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage bezüglich Pointer(C++)


amida maru
2007-12-22, 22:08:07
Hallo. Ich hab heute das erste mal new mit dynamischer arraygröße verwendet... ich habe am anfang immer so gedacht:


CTest *test = NULL;
test = new CTest[2];
test[0]->SetValue(30);
test[1]->SetValue(40);

also durch den pfeiloperator(->) auf die methoden der klasse zugreifen
aber dank dem compiler hab ich gemerkt das man . statt -> benutzen muss....
aber meine frage ist wieso? test ist doch ein pointer...
Bitte erklärt es mir.

MfG
Tibo

Marscel
2007-12-22, 22:54:08
'test' ist ein Pointer auf ein Array mit 2 CTest-Objekten. Und wenn du auf dieses Array mittels Index zugreifst, hast du keinen Pointer, sondern das Objekt vorliegen. Deswegen der '.' statt '->' wie im Falle von Pointern.

amida maru
2007-12-23, 21:08:24
geht das genauer? Wieso greif ich als objekt drauf zu und nicht als Pointer? und wieso greif ich wenn ich sowas "normal" deklarier: CTest *pointer = new CTest;
dann auf die funktion durch -> zu? und wie kann ich bei diesem beispiel mittels . zugreifen?

Coda
2007-12-23, 21:22:15
Weil es Objekte sind und keine Pointer im Array.

Im zweiten Fall hast du einen Pointer. In "diesem Beispiel" müsstest du zuerst Dereferenzieren, also "(*pointer)." was dort "pointer->" entspricht.

amida maru
2007-12-23, 21:57:31
wieso ist der zweite fall ein pointer und kein objekt?

Coda
2007-12-23, 21:59:04
Weil's so dasteht.

Legolas
2007-12-23, 22:43:05
Der [] Operator dereferenziert deinen Zeiger. Deswegen hast du das Objekt in der Hand und nicht mehr den Zeiger.

del_4901
2007-12-23, 22:54:23
Das weiß doch Amida alles selber, als Profi-C++ Programmierer.
Ihm ist sicherlich nur vorrübergehend entfallen, das Arrays nichts anderes als Zeiger sind. Und die Lösung für ein array mit Zeigern ist doch denkbar einfach, nich war Amida?

Gnafoo
2007-12-24, 01:35:50
a[i] ist nur eine andere Schreibweise für (*(a+i)). Da siehst du auch, was passiert: der Pointer wird an die Position im Array angepasst und dann dereferenziert. Ergo hast du danach keinen Pointer mehr, sondern das Objekt an der Adresse a+i.

(Man beachte dabei, dass die Addition von i hier wegen der Pointer-Aritmetik nicht den Wert i addiert, sondern ein i-faches der Objektgröße).

Gast
2007-12-24, 02:24:44
CTest test
ist ein Objekt.

CTest *pTest = new CTest
ist ein Pointer.

CTest test[2]
ist ein Array von 2 CTests, wobei man mit test[0] auf das erste Objekt zugreifen kann. Aufs zweite detto mit test[1].
Um Methoden auf Objekte aufzurufen verwendet man den . Operator. Auf pointer kann man Methoden nicht direkt aufrufen, da muss man vorher dereferenzieren, entweder mittels (*pTest).methode() oder, weil dass ein bisschen umständlich zu schreiben ist, mit pTest->methode()
Irgendwelche Unklarheiten?

Preisfrage: Wie ruft man Methoden auf
CTest *pTtest = new CTest[5]
auf?

gute nacht

MuLuNGuS
2007-12-24, 09:48:28
ich finde hartnäckigkeit sollte belohnt werden ;)



#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <conio.h>

using namespace std;

static int counter = 0;

class aClass
{

public:
aClass()
{
counter++;
char* str;
mynum = itoa(counter, str, 10);
}

aClass(string _mynum) : mynum(_mynum)
{
}

~aClass()
{
}

string& GiveName()
{
return mynum;
}


private:

string mynum;
};


int _tmain(int argc, _TCHAR* argv[])
{
aClass *paClass = new aClass[2];

for(int i = 0; i < 2; i++)
{
cout << (*(paClass+i)).GiveName().c_str() << endl;
cout << paClass[i].GiveName().c_str() << endl;
cout << (paClass+i)->GiveName().c_str() << endl;
cout << endl;
}

getch();

return 0;
}

amida maru
2007-12-24, 18:09:22
alpha tier so dumm brauchste mich net stellen... nur weil ich das nicht wusste... ich habs jetzt kapiert ;) danke leute

TheGamer
2007-12-25, 09:51:50
alpha tier so dumm brauchste mich net stellen... nur weil ich das nicht wusste... ich habs jetzt kapiert ;) danke leute

Wer sowas nicht weiss hat auch nicht das Recht in einen Threads zu sagen er sei ein C++ Profi ;)

Was auch immer ein C++ Profi ist ;D

Weil du bist kein Profi, denn ein "Profi" denkt ueber sowas nicht mehr nach und kann/weiss im Schlaf wie es geht und warum. Keiner von uns hier die antworten denken noch ueber sowas nach. (Muessen wir Goetter sein wenn du schon ein Profi bist?)


Aber dich kennt man ja hier im Forum, immer wieder schoen :)


Hoer doch einfach auf zu sagen du bist ein Profi dann passt es ja :), sonst ist es ein wenig laecherlich (dann musst du dich auch nicht ueber Posts wie von alphatier wundern), du blutiger Anfaenger (es ist ja nichts dabei wenn man etwas noch nicht beherrscht, darum lernt man es ja)

rotalever
2007-12-26, 21:52:10
Sowas geht auch :biggrin:

int *a = new int [313];
if (*((int *)(((char *)&a[5])-16)) == *(a+1))
{
printf ("Oo");
}

The_Invisible
2007-12-27, 09:22:38
... und nach einem jahr musste man den source wieder hernehmen und kleinere änderungen machen, oder ein nachfolger durfte das übernehmen ;D

mfg

rotalever
2007-12-27, 11:42:20
Wobei solche Codeschnipsel ja eine nette Übung im Umgang mit Pointern und Arrays darstellen...