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-Anweisung 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 Elementfunktion einer verwalteten Klasse als Parameter, Rückgabetypen oder lokale Variablen zu verwenden:
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ückgabetypen 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