2009-05-27 10 views
0

管理されたC++でアプリケーションを作成しましたが、インスタンス化しようとするとエラーが表示される私たちはoutポインタオブジェクトでマネージコードにアクセスできますか?

objから* objに変換できません。私がポインタobjとしてインスタンス化するとき、エラーは表示されません。

so。そのようなクラスにポインタオブジェクトを作成せずにアクセスする方法はありますか?

+0

コードスニペットを追加して、より明確な意味を表示できますか? – mikelong

+0

c#.netタグを削除してください。 – mikelong

+0

C#をタグから削除しました。次の質問:このマネージドC++(質問テキストのように)またはC++/CLI(タグのように)ですか?彼らは2つの全く異なるものであり、質問の解釈を完全に変えます。 –

答えて

0

スタックに作成することができます。

MyObject foo; 
foo.bar(); // accessing bar method on object foo 

たぶんあなたが探している構文はこれです:

MyObject *foo = new MyObject; 
foo->bar; 
2

質問は、あなたが管理C++を使用していると言うと、タグは、VS 2005で(利用可能なC++/CLIを使用していると言いますまたはそれ以降)。おそらく、C++/CLIとの混乱を避けることができます。

これが使用している場合は、C#から「翻訳」する2つの方法があります。

// Construct 
MyClass c = new MyClass(); 

// Call some method 
c.MyMethod(); 

Console.Writeline(c); // will call ToString on MyClass 

// Finished with it 
c.Dispose(); 

あなたはこのようにC++/CLIでこれを書くことができます:

MyClass ^c = gcnew MyClass; 

// Call some method 
c->MyMethod(); 

Console.Writeline(c); // will call ToString on MyClass 

// Finished with it 
c->Dispose(); 

変数cは "ハンドル" と呼ばれている、いない^の代わりに宣言ポインタ、あなたには、いくつかのC#を持っていると仮定*。またnewの代わりにgcnewを使用する必要があります。これはC#の参照変数と同じもので、C++のポインタと似ています(ただし同じではありません)ので、->を使用してメンバーにアクセスします。

それともあなたはこのようにそれを書き込むことができます。

// Create with local scope 
MyClass c; 

// Call some method 
c.MyMethod(); 

Console.Writeline(%c); // will call ToString on MyClass (note the %) 

最初に注意する:私たちは地元のC++変数のスタイルでそれを宣言する。オブジェクトを明示的にgcnewする必要はありません。次に、オブジェクトをローカル変数(またはそのような変数へのC++参照)として扱います。だから私たちは使う。 ->の代わりに第3に、このローカルオブジェクトをハンドルに変換するには、%という接頭辞を付けることができます。これは、通常のポインタで使用する&の.NETに相当します。それは、「オブジェクトのアドレスを取る」または「オブジェクトにハンドルを渡す」を意味します。最後に、オブジェクトにDisposeを呼び出す必要はありません。コンパイラは、DisposeメソッドがデストラクタがC++/CLIで実装されるメカニズムであるため、宣言したスコープの最後にそれを行います。

+0

私はこれを作ることができます Console.WriteLine(c.ToString()); ?? –

+0

はい、cがオブジェクトの場合(3番目のコード例のように)。 ToString()は、WriteLineが受け入れるハンドル(System.String ^)を返します。 cがハンドルの場合、c-> ToString()を置く必要があります。 –