2012-05-03 15 views
3

次のコード:参照をクラスメンバーとして使用できないのはなぜですか?

エラーC3160: 'int型%':マネージクラスのデータメンバは、私が考えたこのタイプ

を持つことができません

ref class A 
{ 
private: 
    int% referenceToAnInt; 
}; 

は、Visual Studioで次のエラーを生成しますトラッキング参照は管理されたものだったので、管理されたクラスのメンバではないのはなぜですか? また、C++/CLIで値の型への参照を正しく保存するにはどうすればよいですか?

+0

一度に1つ質問してください。 2つの異なる質問がある場合は、2つの投稿で質問してください。 – svick

答えて

4

CLRでは、追跡参照をフィールドとして格納することはできません。また、C++/CLIのスペックから:

自動以外の保存期間が のトラッキング参照を含むプログラムが不正です。 (これはデータメンバとして追跡 参照した排除。)

私は、彼らはあなたが長い参照されたオブジェクトの実際の寿命より参照を保持する問題を回避したいと思います。代わりに、値を保持するためにラッパーrefクラスを使用するか、読み取り/書き込みのためにdelegateを使用することができます。

2

トラッキングの参考文献です。「管理されたもの」というのは、なぜそれらをクラスのメンバーとして使用できないのかということです。 C++ &のリファレンスと似ていますが、他の方法でローカル変数を参照するために使用できます。しかし、ローカル変数は、短期ストア(スタック)に格納される。つまり、そのローカル変数を含むメソッドが終了すると、参照はもう有効ではありませんが、オブジェクトはまだ存在する可能性があります。

これはメモリーセーフではないため、これは.Netで禁止されています。

+0

検証可能な出力を生成するために '/ clr:safe'スイッチを使用しない限り、C++/CLIは安全性を強制しません。 –

+0

C++/CLIはありませんが、この場合はCLRが行います。 – svick

関連する問題