gcnew
C++/CLIでは、.netオブジェクトを作るのに、(newではなく)gcnewを使うそうです。
(gcnewはマネージトな型のインスタンスを作るやつで、これによって作られたものは参照型だろうと値型だろうとガベージコレクションのヒープに確保されます。)
そしてそのgcnewによって返されるのも、ポインタではなくハンドルというものになるそうです。(*ではなく^を使うことになります。)
なお、ハンドルを使うからといってポインタがなくなってしまったわけではなく、C++/CLIではネイティブのクラスをnewしたりとかはできます。(でなきゃなんでC++なんて使うのかわかりませんしね)
HelloWorld.cpp
#using<System.Windows.Forms.dll>
#using<System.dll>
using namespace System::Windows::Forms;
int main()
{
Form ^form = gcnew Form();
Application::Run(form);
}
このプログラムはWindowsFormsでウィンドウを表示します。
ここでは.netオブジェクトのformを作っているため、gcnewを使ってインスタンスを生成しています。(newだとコンパイルエラーになります)
※ちなみに、ここでSystem.Windows.Forms.dllだけでなくSystem.dllまで#usingしているのは、System.ComponentModel.Componentを使っているからです。(これがないとコンパイルエラーになります。)
メンバへのアクセス
gcnewとnewはいろいろ違うところがありますが、メンバへのアクセスは同じで、->を使います。
#using<System.Windows.Forms.dll>
#using<System.dll>
using namespace System::Windows::Forms;
int main()
{
Form ^form = gcnew Form();
form->Text = "Hello World!";
Application::Run(form);
}
nullptr
ハンドルの変数は、ポインタと違ってNULL(0)にすることができません。
かわりになるのがnullptrです。
Form ^form = nullptr;
ちょっとややこしいですが、nullptrは、ハンドルだけではなくポインタの変数にも代入することが出来ます。
int *p = nullptr;