C++/CLI_ C# のプロパティ機能を C++/CLI で使う

自作型をコンボボックスに表示したC# のコードを C++/CLI でも実現したい。メモ 03

--経緯--
Displaymember と Valuemember を使う方法は C++/CLI では使えない ?
getter setter のプロパティで書かないと使えないのか ?だが色々調べてたら property が出てきた。
最初から「 cli getter setter 」で検索かければよかった。

 

property を使う。

 

C++/CLI での書き方

    public:
        property int myKey_;    // トリビアルプロパティという
       
    // key を受け取る
    // ((MyKeyindex ^)comboBox1->SelectedItem)->myKey_

 

C# での書き方

    public int myKey_ { get; set; }

 

あとは C# で書いたようにすれば DisplaymemberValuemember が使える。
※ -> や ^ など変更する箇所あり。

 

property メモ

1.

C# の getter/setter を書くとコンパイラが裏でなんやかんや。
property も裏で get 及び set アクセサ・自動変数を自動で作成してくれる。

 

2.

アクセス指定 ( ただのコピペ )

ex ) セッターを private に指定しているので、
外部からの Value プロパティへ値の代入はできない

    public ref class SampleSlazz
    {
        private:
            _value;
       
        public:
            SampleClazz() : _value(0){}
           
            property int Value
            {
                int get() { return this->_value; }
           
            private:
                void set(int value){ this->_value = value;}
            }
            int _Value;
    };
   
    int main(stdcli::array<String^>^ args)
    {
        SampleClazz sample;
        // コンパイルエラー
        sample.Value = 7;
       
        // プロパティ外のアクセサ指定子は影響しないので、publicメンバ
        sample._Value = 10;
        Console::WriteLine("Value : {0}", sample.Value);
    }

 

3.

以下のように書いたら下記のエラーが出力されて実行されなかった。

warning C4717:すべてのコントロールのパス、関数を回帰すると
ランタイム スタック オーバーフローが発生します。

そりゃそうだ。自分自身を参照しているんだから。

 

    property int myKey_
    {
        int get( ){ return this->myKey_; }
        void set(int v){ this->myKey_ = v; }
    }

なお、property なしで ↑ のように書いたら構文エラー。メンバだから。

 

 

 復習

プロパティ:
JavaC++ にはない機能。
クラス外部から見るとメンバー変数のように振る舞い、
クラス内部から見るとメソッドのように振舞うもの。

 

 

 

こちらから。もしかして、インデクサなるものを使えばコンボボックスの紐づけ簡潔に実装できる ?
http://vene.wankuma.com/prog/CppCli_Property.aspx
https://msdn.microsoft.com/ja-jp/library/2f1ec0b1.aspx
https://ufcpp.net/study/csharp/oo_property.html

C++C# 的な実装
http://marycore.jp/prog/cpp/simple-property/
https://takachan.hatenablog.com/entry/2018/07/28/215502
https://qiita.com/HogeTatu/items/1bb3a394f88ba90cd37e
http://d.hatena.ne.jp/poyonon/20110828/1314487034

インデクサ
http://wisdom.sakura.ne.jp/programming/cs/cs40.html
https://so-zou.jp/software/tech/programming/language-comparison/class/property.htm

以上。