Einschränkungen bei der Kombination von nativen und verwalteten Klassen

Veröffentlicht: Dezember 2009
Von Richard Kaiser und Alexander Kaiser

In Visual C++ für Windows Forms-Anwendungen gibt es zwei Kategorien von Klassen: Einerseits die Klassen nach dem C++-Standard, die auch als native Klassen bezeichnet werden, und andererseits die sogenannten „verwalteten Klassen“ von C++/CLI. Im Folgenden werden einige der Einschränkungen vorgestellt, die bei Verwendung von nativen Klassen in verwalteten Klassen und umgekehrt gelten.

Dieser Artikel ist ein kurzer Auszug aus dem Buch „C++ mit Microsoft Visual C++ 2008“ (ISBN 978-3540238690), das C++ mitsamt den Visual C++-Erweiterungen (C++/CLI) umfassend darstellt. Der Verfasser dieses Buches ist ein erfahrener C++- und C#-Trainer, der auch für Firmenschulungen zur Verfügung steht.

1.   In einer verwalteten Klasse kann nur eine verwaltete Klasse, aber keine native Klasse definiert werden. Deswegen kann man eine #include-Anwei­sung mit einer nativen Klasse

#include "MeineKlasse.h" // soll eine native Klasse enthalten

auch nicht nach

public ref class Form1:public System::Windows::Forms ...

{

angeben. Es ist aber problemlos möglich, native Typen in einer Elementfunk­tion einer verwalteten Klasse als Parameter, Rückgabetypen oder lokale Variablen zu verwen­den:

private: System::Void button1_Click(System::Object^  sender, 

                                    System::EventArgs^  e) {

C c; // mit einer nativen Klasse C 

// verwende c

}

2.   Eine native Klasse kann keine Datenelemente eines verwalteten Klassentyps wie z.B. String^  enthalten.

class C{ 

  String^ s; // error: Ein verwalteter 's' kann nicht in 

       // einem nicht verwalteten 'C' deklariert werden       

};

Wenn man ein Datenelement eines verwalteten Typs in einer Klasse verwenden will, muss man die Klasse mit dem Schlüsselwort ref oder value als Verweis- oder Werteklasse definieren.

ref class C{ // oder " value class"

  String^ s; // das geht

};

Verwaltete Klassentypen können aber Datentypen von Parametern, Rückgabe­typen oder lokalen Variablen in Elementfunktionen einer nativen Klasse sein.

Beispiel:    In der nativen Klasse C2DPunkt kann man in der Elementfunktion toStr auch den Datentyp String anstelle von string verwenden:

using namespace System; // für String

using namespace System::Windows::Forms; // für TextBox 

class C2DPunkt{ 

  double x,y;

  void Init(double x_, double y_)

  {

  x = x_;

  y = y_;

  }

  String^ toStr()

  {

  return String::Format("({0}|{1})", x,y);

  } // z.B. (2,345|3,45678) 

  void anzeigen(TextBox^ tb)

Zurück: Konversionen zwischen string und String | Weiter: C++/CLI-Erweiterungen