1

マネージC++プロジェクトで、C#.NETプロジェクトから使用できるクラスで、手書きのゲッター/セッターを使用してプロパティを定義する必要があります。

  • このテーマに関するcodeprojectの記事__property float Volume;では、これは古く、現在はとして分類されていることを推奨してい/crl:oldSyntaxます。

  • C++の記事に対するOpenStandardマネージ拡張では、プロパティを定義するとproperty float Volume;、バッキングフィールドが自動的に生成されると書かれていますが、これは私が望まない、または必要としないものです。

  • のようなプロパティを定義するだけで、でproperty float Volume;正常にコンパイルされますが、 throw/clrのような手書きのゲッター/セッターを追加しようとします。float Mixer::Volume::get(){ .. }Error C2084: function X already has a body

では、バッキングフィールドなしで、カスタムビルドの手書きゲッター/セッターメソッドを使用して、読み取り専用または読み取り/書き込みプロパティを定義する適切な方法は何ですか?

4

2 に答える 2

6

ヘッダーのみのバージョンを自分で見つけました。ゲッターとセッターをcppファイルに実装する場合、構文は次のとおりです。

///////////////////////
// Foo.h:
///////////////////////
ref struct Foo
{ 
    property float Volume
    {
        float get();
        private: void set(float value);
    }
private:
    float m_backingField;
}

///////////////////////
// Foo.cpp:
///////////////////////
float Foo::Volume::get()
{
    return m_backingField;
}

void Foo::Volume::set(float value)
{
    m_backingField = value;
}

編集:いくつかの追加情報

  • ゲッターとセッターに異なるアクセス修飾子を指定できます。セッターをプライベートにするためにソースコードを変更しました。C#とは異なり、バッキングストアの自動生成を使用する場合はこれが不可能であることに注意してください。
  • 以前は「C++のマネージ拡張」と呼ばれていたものが、現在(Visual Studio 2005以降)C ++/CLIと呼ばれています。名前を変更するだけでなく、完全に新しいリビジョンです。double underscore__propertyキーワードはマネージド拡張機能からのものであり、現在は非推奨です。
于 2013-03-26T11:36:03.580 に答える
0

次のように、ヘッダーファイルでプロパティを1回だけ宣言する必要があることがわかりました。

property float Volume {
    float get() {
        return 0;
    }
    void set(float value) {
    }
}

次のようにプロパティを宣言すると、バッキングフィールドが自動的に生成されます。

property float Volume;
于 2013-03-26T11:07:46.180 に答える