Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

11

30.08.2005, 09:58

Zitat von »"Outsider"«

wie man an diese vftable oder den vfptr "bequem" dran kommt, also ohne einfach nur herum zu casten.
Ich wüsste gerne wie das geht, so dass man zB Methoden einer klasse direkt aus der vftable der klasse aufrufen könnte.


So weit ich weiß, ist dass nicht möglich und das finde ich auch gut so (zumindest nicht mit "normalem" C++ Code, mit InlineAssembler oder Extremtricksereien kann man es vermutlich schaffen auf die VTabelle zuzugreifen)

Zitat von »"Outsider"«

was mich außerdem interessiert ist, ob es möglich ist anhand eines übergebenen zeigers auf eine bestimmte klasseninstanz zu bestimmen, welchen typ dieses objekt hat, denn der pointer kann auch einfach gecasted worden sein.
Ein Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
class A {
public:
   int m_iA;
};
class B : public A {
public:
   int m_iB;
};

void foo(A* pA)
{
  //zeigt A* auf ein B?

}



Ja das ist möglich, das Stichwort lautet RTTI ist wieder in de PDF in Kap. 15.6 S.477 zu finden

Zitat von »"Outsider"«


Und was ich auch gerne wüsste, aber nicht erfahren hab:
Steht irgendwo die größe einer instanz?
Bei dem Beispiel wäre eine instanz der klasse B ja einen int größer als eine von A...
wäre das so, dann könnte man sich den guten alten size member am anfang sparen...


Also sizeof() funktioniert nicht, denn sizeof ist ein Operator und keine Funktion. Ich kenne eigentlich auch kein Äquivalent dazu. Du könntest aber jedes Objekt seine eigene Größe, wenn es erzeugt wird speichern lassen.

Anonymous

unregistriert

12

30.08.2005, 12:32

Wenn Du keine virtuellen Methoden deklarierst, dann wird (soviel ich weiss) erst gar keine Tabelle angelegt.
Du könntest aber in Deiner Basisklasse einen eigenen Funktionszeiger mitführen. Ähnlich, wie bei dem Beispiel von Gast, bei dem die Größe des Objekts gespeichert wird, könntest Du im Konstruktor der abgeleiteten Klassen den Funktionszeiger (und evtl. weitere Dinge) entsprechend setzen.
Bei zu komplexen (Vererbungs-)Strukturen könnte das aber auch schnell sehr buggy werden, wenn man nicht aufpasst, denke ich.

Zitat von »"Patrick"«

[...] An die Daten die im RAM sind kommst Du Atens nicht dran, Btens hast Du da drin nichts zu suchen (zu gefährlich) und Ctens versteht das selbst ein guter Assemblerprogrammierer kaum noch was da drin ist.

Zu A: Doch, da kommt man dran.
Zu B: Vollkommen richtig, es sei denn, man ist sich 100%ig sicher, was man tut.
Zu C: Aber sicher kann man das verstehen.

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

13

30.08.2005, 12:34

So, jetzt hab ich auch an diesem Login-Problem zu leiden.
Der "zweite" Gast war ich ;)

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

14

30.08.2005, 15:12

also ich denke schon dass sizeof funktioniert... ich kann mich auch täuschen aber ich hab das gefühl ihr macht euch hier gedanken um sachen die eigentlich total easy sind^^

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

15

30.08.2005, 15:17

Zitat von »"Outsider"«


Ich wüsste gerne wie das geht, so dass man zB Methoden einer klasse direkt aus der vftable der klasse aufrufen könnte.

wofür denn überhaupt? du kannst doch bequem von der Klasse A die Funktion foo einfach aufrufen über a.foo(). wenn du die basismethode nehmen willst (also die eigentlich überschrieben ist) müsste es gehen mit a.B::foo() oder irgendwie sowas... also vielleicht gibt es irgendeinen total komplizierten und überflüssigen weg das auch übers vtable zu erreichen, aber warum?? der effekt ist genau der gleiche..


Zitat


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
class A {
public:
   int m_iA;
};
class B : public A {
public:
   int m_iB;
};

void foo(A* pA)
{
  // Zeigt pA auf ein B?

}


Und was ich auch gerne wüsste, aber nicht erfahren hab:
Steht irgendwo die größe einer instanz?
Bei dem Beispiel wäre eine instanz der klasse B ja einen int größer als eine von A...
wäre das so, dann könnte man sich den guten alten size member am anfang sparen...


warum sollte sizeof(A) nicht funktionieren??

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

16

30.08.2005, 15:29

Zitat von »"Spik)evil("«


warum sollte sizeof(A) nicht funktionieren??


Weil der Wert den sizeof liefert, während des Kompilierens ermittelt (und eingesetzt) wird und nicht zur Laufzeit => sizeof(Base) liefert immer die Größe von Base, auch wenn ein Derived übergeben wird

mfg Philipp

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

17

30.08.2005, 16:00

was meinst du mit ein derived übergeben? wenn ne klasse abgeleitet wird? das ist doch genau das gleiche.. auch wenn ein objekt polymorph ist, die größe der zur verfügung stehenden klassen ändert sich nicht, und damit sollte es daher gehen. bedeutet es ändert sich zwar die größe des objektes, aber nicht die der klassen und mit sizeof guckst du dir ja sowieso nur die klassen an

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

18

30.08.2005, 16:11

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Base
{
  int a;
};

class Derived : public Base
{
  int b;
}

void doSomething(Base& b)
{
   int objectsize = sizeof(b);
   cout << objectsize;
}

C-/C++-Quelltext

1
2
3
4
5
Base b;
Derived d;

doSomething(b);
doSomething(d);


doSomthing würde in beiden Fällen die Größe von Base ausgeben und nicht wie von manchen vielleicht erwartet beim ersten Aufruf die Größe von Base und im zweiten Aufruf die Größe von Derived
=> sizeof kann nicht verwendet werden, um die Größe von Objekte in Ableitungshierachien zur Laufzeit zu bestimmen
Ich hoffe das ist jetzt verständlich

mfg Philipp

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

19

30.08.2005, 16:12

das halte ich fürn gerücht... werd ich mal testen.

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

20

30.08.2005, 16:14

Teil mir doch deine Erkenntnisse nach dem Test mit :ohoh:

mfg Philipp

Werbeanzeige