2

OS: XP
IDE: VS 2008
ビジュアル C++ で行っているプロジェクトでは、std::vector内部マネージド クラスを宣言しました。

std::vector<pts> dataPoints;//this gives error c4368 : mixed type not allowed 

しかし、これは機能します

std::vector<pts> * dataPoints;//a pointer to the vector  

次に、マネージ クラスのコンストラクターと同様に、フリー ストアにこのベクターを作成しました。

dataPoints = new std::vector<pts>(noOfElements,pts());//which is not so attractive.

ベクトルが必要な理由は、読み込んでifstreamそれらの値をベクトルに格納するファイルがあるためです。
Q1)ネイティブ型のオブジェクトへのポインタを宣言できるのはなぜですか(私は推測します)、オブジェクトではありませんか? さらに、ベクトルを試す前に、マネージド配列を試してみました

cli::array<Point> dataPoints //and i defined it later.

しかし、私がこれを行うとき

ifile >> dataPoints[i].X;   

エラー c2678 : operator= is not overloaded for int!!. が発生します。
Q2) ここでマネージド コードを使用できないのはなぜですか。最初はラッパークラス Int かもしれないと思っていましたが、自動アンボックス化 (変換演算子) で処理する必要がありますか?それとも、Point::X が修飾propertyされているため、正常に認識されないのintでしょうか? 私は何が欠けていますか?これが私が行った理由vectorpts 解決策です。
pts以下のとおりであります

 struct pts
{
  int X, int Y;
  pts() : X(0),Y(0){}
  pts(int x,int y) : X(x),Y(y){}
};//this i created to store the data from the file.
4

2 に答える 2

5

マネージド クラス オブジェクトの重要なプロパティは、ガベージ コレクターによって移動されることです。これは、ヒープを圧縮するときに発生します。これはネイティブ C++ オブジェクトに大混乱をもたらし、そのメンバーへのポインターは無効になります。したがって、原則として、コンパイラはネイティブの非 POD オブジェクトをマネージド オブジェクト内に埋め込むことを禁止します。ポインターは問題ありません。

>>オペレーターの使用に関して、まったく同じ問題が存在します。int は operator>>() への参照によって渡されます。int の参照を取得するコードと演算子を呼び出すコードの間でガベージ コレクターが起動すると、災害が発生します。そのための簡単な回避策は、ローカル変数を介した中間ステップです。

int x;
ifile >> x;
dataPoint[i].X = x;

ローカル変数は安定しており、ガベージ コレクションの対象にならないため、これは機能します。

これはネイティブ コードでは問題になりません。ref クラスはネイティブ関数を簡単に呼び出すことができることに注意してください。したがって、この 2 つを分離することは有用であり、かつ/または必要です。

于 2013-04-19T19:20:50.407 に答える
1

マネージド型内にネイティブ型を直接含めることはできません。これは C++/CLI の単なる制限です。これは、ネイティブ型内のポインターの可能性に関係しているのではないかと考えています。ネイティブ型がマネージド型内に直接ある場合、ガベージ コレクション中にマネージド オブジェクトがシャッフルされると、これらのポインターは元の、現在は正しくないメモリを指します。

したがって、ガベージ コレクションによって内部が変更されないように、ネイティブ オブジェクトはヒープ上にある必要があります。したがって、ベクトルをポインターとして保持し、適切に削除する必要があります。後者は完全に簡単ではないことに注意してください。C++/CLI の知識が必要です (C# とは微妙に異なります)。http://msdn.microsoft.com/en-us/library/ms177197(v=vs.100).aspxを参照してください。

私が最後にこれを行ったときを見て、私が持っていた私のファイルで

public:
    !NetClass();
    ~NetClass() { this->!NetClass(); } // avoid arning C4461
private:
    class NativeImpl* const m_pImpl; // can't contain NativeImpldirectly

そして、私が持っていたcppファイルで

NetClass::!NetClass()
{
    // implement finalizer in ref class
    delete m_pImpl;
}

複数のネイティブ クラスを含める場合は、ここで pimpl イディオムを使用することをお勧めします。「PIMPL」イディオムを使用する理由を参照してください。.

最後に、私が最後にこれを行ったのはかなり前のことです。これを行っている場合は、自分が何をしているのかを本当に知る必要があります。C++/CLI in Actionという本を使用しました。これをお勧めします。

編集

STL/CLR に関するこの記事は興味深いようです: http://blogs.msdn.com/b/nikolad/archive/2006/06/16/stlclr-intro.aspx。引用する

STL/CLR (元は STL.NET と呼ばれていました) は、マネージ型のオブジェクトを操作できる標準テンプレート ライブラリ (STL) の実装です。VC++ には既に STL が実装されていますが、現在はネイティブ型のみで動作しています。

(あなたの Q2 については、私は本当にお手伝いできません)

于 2013-04-19T18:47:31.567 に答える