Irix > Programmieren, Kompilieren

Eine harte Nuss für C++ Gurus

(1/6) > >>

majix:
Ich habe ein kleines Problem mit C++. Man stelle sich vor


--- Code: ---
class A {
  virtual f();
}

class B : public A {
  virtual f();
}

--- Ende Code ---


Ich habe also zwei Klassen A und B, und die haben jeweils eine virtuelle Funktion. Nun bekomme ich irgendwo im Programm zwei Pointer des Typs A*, und möchte nun gerne wissen, ob beide Objekte die gleiche Implementierung von f haben (sonst können sie sich unterscheiden). Also sowas wie


--- Code: ---
A* o1,o2;
if (o1->f == o2->f)
   mach was tolles

--- Ende Code ---


Ich will sozusagen die Funktionspointer vergleichen. Nur leider - das geht eben nicht. Bei virtuellen Funktionen sind beide pointer immer identisch, obwohl die Implementierungen verschieden sind (!). Dieses Phänomen wird auch als solches beschrieben, und das ist wohl auch so gewollt. Nur eben von mir nicht.

Kann mir jemand einen Tipp geben, wie ich wirklich die Funktionspointer vergleichen kann?

Grüße,
Kaya

rob_gester:
vielleicht findest hier was:
http://www.function-pointer.org/
rob

Jasper:
Hallo Kaya,

ich bin leider auch kein ausgesprochener C++-Spezialist :-(

Dass beide Funktionen denselben Pointer haben, liegt wohl im wesentlichen daran, dass die Auflösung des Methodenaufrufs eben indirekt über eine virtuelle Funktionentabelle funktionert, d.h. der Caller erhält im wesentlichen nur einen Zeiger in die VFT, und auf den Rest hast Du keinen Einfluss.

Sowas lässt sich m.E. nur mittels Metaklassen und/oder Funktionsobjekten statt Funktionen lösen, das ist aber bei Dir wohl keine Option. MIt Assemblerpfusch kriegst Du das sicher auch hin, willst Du aber nicht :-)

Zu Deiner Frage siehe z.B. auch:

http://groups.google.de/groups?hl=de&lr=&ie=UTF-8&oe=UTF-8&threadm=760hin%24qva%241%40engnews1.eng.sun.com&rnum=10&prev=/groups%3Fhl%3Dde%26ie%3DUTF-8%26oe%3DUTF-8%26q%3Dvirtual%2Bmethod%2Bcompare%2Bimplementations%2Bc%252B%252B%26spell%3D1

Frage: Wozu brauchst Du das denn? Vielleicht kannst DU Dein Ziel auf anderen Wegen erreichen.

Gruss

JM

Brombaer:
Hallo Kaya,

eigentlich willst Du ja wissen von welchem Typ A oder B sind ? Schau mal unter RTTI (Run Time Type Information) nach.

Viel Glück

Matthias

majix:
Hi Matthias, Jasper,

das ist eben mein Problem: Ich will nicht wirklich wissen, ob A und B den gleichen Typ haben, ich habe nämlich wesentlich mehr Ableitungen von A, und diese haben auch wieder Ableitungen. Ich will eben nur wissen, ob zwei abgeleitete Objekte die gleiche Funktion f besitzen - in anderen Punkten können und werden sich die Klassen sehr wohl unterscheiden.

Es hierbei um folgendes: Ich habe verschiedene Shaderklassen, und jede Klasse besitzt eine virtuelle Methode zum aktivieren des Shaders und eine zum deaktivieren. Wenn ich nun einen neuen Shader aktiviere, dessen Deaktivierungs-Funktion mit der des aktuellen Shaders übereinstimmt, dann brauch ich den alten auch erst gar nicht zu deaktivieren. Spart ein paar OpenGL-Aufrufe. Denn in vielen Fällen werden unterschiedlich Shader identisch dektiviert, aber verschieden aktiviert.

Grüße,
Kaya

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln