2

次のような C++ アンマネージ クラスがあるとします。

#include "note.h"
class chord
{
private:
    note* _root;   // or, as in my real class: std::shared_ptr<note> _root;
    // _third, _fifth, _seventh, etc
public:
    someClass(const note n1, const note n2, const note n3);  // constructor takes some of these notes to make a chord

    std::shared_ptr<note> root() const;   // returns ptr to root of the chord
    std::string name() const;  // returns the name of this chord

}

これで、これらのクラスの両方を cli のマネージド クラスにラップする必要があることがわかりました。しかし問題は、ネイティブ クラスへのプライベート ポインターをコンストラクターに渡すにはどうすればよいかということです。

現状では、Note* _src は noteWrapper 内で非公開です。ただし、ネイティブ Chord() にはネイティブの Note オブジェクトが必要です。そのため、chordWrapper は noteWrappers _src にアクセスしてコンストラクターに渡すことができません。内部メンバーを .net に公開せずに、これを達成するにはどうすればよいですか?

編集**

// assume noteWrapper is already defined, with Note* _src as private
public ref class chordWrapper
{
     private:
     Chord* _src;
     public:
     chordWrapper(noteWrapper^ n1, noteWrapper^ n2, noteWrapper^ n3)
     {
          _src = new Chord(*n1->_src, *n2->_src, *n2->_src); // _src is inaccessible
     }
}

chordWrapper はその内部メンバーにアクセスできないため、上記は不可能です。フレンドもサポートされていないため、内部メンバーを .net から非表示にし、cli クラスに公開するために他に何ができるかわかりません。

これを処理する適切な方法は何ですか?

4

2 に答える 2

7

内部メンバーは、C++/CLI のプライベート メンバーと同じスコープにあります。C# 内部修飾子と同じです。私見では、可視性修飾子のないクラス/構造体は、デフォルトで内部として解釈されると思いますか?

public ref class noteWrapper
{
    Note* _src;
}

のような同じスコープにあります

public ref class noteWrapper
{
private:
    Note* _src;
}

しかし

public ref class noteWrapper
{
internal:
    Note* _src;
}

cli ライブラリと追加で共有される非公開メンバーです

于 2014-02-12T15:11:11.143 に答える
4

「internal」キーワードを使用して、.Net クライアントではなく、cli ライブラリとのみ共有できます。例えば

public ref class noteWrapper
{
internal:
    Note* _src;
}
于 2014-02-12T14:43:56.957 に答える