Root-Basisklasse in C ++

8

Jedes Objekt in .NET erbt (direkt oder indirekt) von der gemeinsamen Wurzel "Objekt". Gibt es in C ++ einen solchen allgemeinen Objektstamm? Wie gebe ich irgendein Objekt an eine Funktion weiter?

%Vor%

EDIT: Um zu verdeutlichen, der Zweck: In dieser Funktion möchte ich einen Zeiger auf Member-Funktion aufrufen. Dafür brauche ich die Objektinstanz und den Zeiger auf die benötigte Funktion. Um die Lesbarkeit zu vereinfachen, möchte ich einen Wrapper mit den beiden erforderlichen Informationen erstellen. Ich bin mir nicht sicher, ob das der beste Weg ist, aber es ist die Hintergrundidee.

    
Littlesmith 08.03.2010, 06:53
quelle

6 Antworten

4

Es gibt keine gemeinsame root-Klasse. Verwenden Sie entweder void *, um ein Objekt in eine Funktion zu überführen, oder definieren Sie besser eine Basisklasse.

    
Corwin 08.03.2010, 06:56
quelle
11

Es gibt keine gemeinsame Basisklasse. aber mit etwas wie boost :: any oder allgemeiner wird ein Template-basierter Ansatz gegenüber einem void * bevorzugt.

    
Terry Mahaffey 08.03.2010 07:04
quelle
3

Template-Funktionen sind vorhanden und vermeiden die Notwendigkeit eines solchen Root-Parents aller Klassen.

%Vor%

Wenn all Ihre Objekte eine Memberfunktion callTheFunction () haben, dann haben Sie genau das gleiche Verhalten wie eine Root-Basisklasse, mit der gleichen Bedingung (alle Klassen haben eine Funktion mit diesem Namen).

Außerdem haben Sie den zusätzlichen Vorteil, dass Sie die Template-Funktion DoSomeStuff() für einige Klassen, die nicht Ihre sind, spezialisieren können und Ihre virtuelle Member-Funktion nicht erben können.

    
Didier Trosset 08.03.2010 12:51
quelle
2
  

Dafür brauche ich die Objektinstanz und den Zeiger auf die erforderliche Funktion.

Das klingt nach "Delegierten". Zuerst müssen Sie auf jeden Fall eine gemeinsame Basisklasse für alle Objekte definieren, die Sie aufrufen möchten. In C ++ können Sie die Mehrfachvererbung verwenden, wenn das Objekt bereits zu einer anderen Hierarchie gehört.

Dann lesen Sie sich die Member-Funktionen und die schnellsten möglichen C ++ - Delegierten durch. Tiefenartikel zum Thema Delegate (bei denen es sich um einen Objekt- und einen Mitgliedsfunktionszeiger handelt, die aneinander gebunden sind). Mit der in diesem Artikel beschriebenen Headerdatei können Sie Delegaten erstellen und sie einfach wie normale Funktionszeiger aufrufen.

    
Greg Hewgill 08.03.2010 07:46
quelle
0

Tut mir leid - in C ++ gibt es kein Root-Stammobjekt. Aber Sie können Ihre eigenen für alle Ihre Klassen definieren.

    
Warpin 08.03.2010 06:55
quelle
0

Es gibt keine gemeinsame Basisklasse in C ++. Es gibt jedoch bereits Bibliotheken, mit denen Sie Memberfunktionen als Delegaten aufrufen können. Sie können versuchen, boost :: function zusammen mit boost :: bind oder boost :: lambda .

    
Bojan Resnik 08.03.2010 12:29
quelle

Tags und Links