スポンサーリンク

| キーワード:

C++/CLIで自作クラスの配列をソート

 近所の村の市の店長はとてもいい人なのだが、中島みゆきの糸をBGMにかけていたときはさすがに神経を疑った。いったい何のつもりだ。泣き出すところだっただろうが。

そんなわけでプエルトリコがデフォルトしたらしい。デフォルトってどういうことなのか正確には掴めていないんだが、要は○○日までにお金払いますよ、という約束を果たせなかったということのようだ。気持ち的に近い言葉としては、不渡りとか踏み倒しとか、そのあたりだろうか。

http://www.yomiuri.co.jp/world/20150630-OYT1T50077.html

この結果、高金利の金融商品「プエルトリコ債」が償還されなくなる恐れがあり、米国の投資信託などが多く保有していることから、国際金融市場に深刻な影響を与える懸念がある。

どうやらこういうのはデフォルト宣言があった次の日にどうなる、というものではなく、数週間かけて影響が出てくるという。もうしばらくしたら連鎖倒産が始まるんじゃないか、と予想する人も沢山いるようだ。どうせゼロ金利だし、取り付け騒ぎとか預金封鎖がくる前に定期預金をタンス預金に切り替えたほうがいいかもしれない。箱根山も騒がしいしね。

 

あとソートのほうなんだが、C#の例は腐るほどあるのにC++/CLIの例がなかなか見つからない。
C#と同類のはずなのに^つけないといけないとか、C++と名乗りながら継承にpublicつけないとか、お前は誰だ言語なのでメモしておかないとはまる可能性がある

 

// ConsoleApplication2.cpp : メイン プロジェクト ファイルです。

#include "stdafx.h"

using namespace System;

ref class DataType{ //自作クラス 何でもいい
    int a;
    System::String^ b;
public:
    int geta(){ return a; }
    System::String^ getb(){ return b; }
    void set(int _a,System::String^ _b){
        a = _a;
        b = _b;
    }
};

//比較用のクラス。
//IComparer<>を継承したクラスを作成し、
//virtual int Compareメンバ関数を定義する
ref class Ccmp : System::Collections::Generic::IComparer<DataType^>
{
public:
    //xがyより小さいときはマイナスの数、大きいときはプラスの数、同じときは0を返す
    virtual int Compare(DataType^ x, DataType^ y)
    {
        if( x->geta() < y->geta() )
            return -1;
        else if( x->geta() > y->geta() ){
            return 1;
        }
        return 0;
    }
};


//使い方
int main(array<System::String ^> ^args)
{
    //データ(配列)を用意
    int sz = 7;
    array<DataType^>^ ary = gcnew array<DataType^>(sz);

    for(int i = 0; i < sz; i++ ){
        ary[i] = gcnew DataType();
    }
    ary[0]->set(5,"5");
    ary[1]->set(2,"2");
    ary[2]->set(7,"7");
    ary[3]->set(1,"1");
    ary[4]->set(3,"3");
    ary[5]->set(5,"5");
    ary[6]->set(8,"8");

    //ソート実行。
    Ccmp^ cmp = gcnew Ccmp();//比較用クラスのインスタンスを作成し、
    Array::Sort( ary, cmp);//Array::Sortの第二引数にそのハンドルを渡す

    //結果確認
    for(int i = 0; i < sz; i++ ){
        Console::WriteLine( "{0} {1}",ary[i]->geta() , ary[i]->getb() );
    }

    int k = Console::Read();

    return 0;
}

 

2 件のコメント

  • お世話になっております。
    プログラム例を見て自分でも実験していますが、わからないことが出たので教えて下さい。

    C++/CLIコード

    #using //これを記述しないとHashSetが使えない

    public ref class DataType { //自作クラス 何でもいい
    int a,b;
    public:
    int geta() { return a; }
    int getb() { return b; }
    void set(int _a, int _b) { a = _a; b = _b; }

    ref class cmp1 : IComparer
    {
    public:
    virtual int Compare(DataType^ x, DataType^ y) override
    {
    if (x->geta() geta()) return -1;
    if (x->geta() > y->geta()) return 1;

    if (x->getb() getb()) return -1;
    if (x->getb() > y->getb()) return 1;

    return 0;
    }
    };

    // ↓追加した
    ref class cmp2 : IEquatable
    {
    public:
    virtual bool Equals(DataType^ other) override
    {//this->geta() でコンパイルが通らない 解決方法がわからない
    //if (this->geta() != other->getb()) return false;

    return true;
    }
    };

    };

    ※ 運用

    //データ(配列)を用意
    int sz = 7;
    array^ ary = gcnew array(sz);

    for (int i = 0; i set(5, 5);
    ary[1]->set(2, -9);
    ary[2]->set(7, 4);
    ary[3]->set(7,-9);
    ary[4]->set(7, 1);
    ary[5]->set(5, 5);
    ary[6]->set(8, 8);

    //ソート実行。

    DataType::cmp1^ cmp = gcnew DataType::cmp1();//比較用クラスのインスタンスを作成し、

    System::Array::Sort(ary, cmp); //ソートはできた

    ///// ↓実験中
    //自作クラスDataTypeをHashSetに登録したいのですが、Equatableインターフェイスを実装できていないので
    //set(-1, 3) とした同じ要素が登録されてしまう
    System::Collections::Generic::HashSet^ HS1 = gcnew System::Collections::Generic::HashSet;

    DataType ^a1 = gcnew DataType();
    a1 = gcnew DataType(); a1->set(-1, 3); HS1->Add(a1);
    a1 = gcnew DataType(); a1->set(4,2); HS1->Add(a1);
    a1 = gcnew DataType(); a1->set(-1, 3); HS1->Add(a1);//これが登録されないようにしたい

    ■ ref class Ccmp : System::Collections::Generic::IComparer のインターフェイスは正常に動作しますが、
    ref class cmp2 : IEquatable は動作しません。
    virtual bool Equals(DataType^ other) で自身のインスタンスと他のインスタンスを比較する必要があるのですが、自身のインスタンスを参照できません。this->geta() とするとコンパイルが通りません。
    エラー E0135 class “DataType::cmp2” にメンバー “geta” がありません と出ます。

    コンパイルが通るようにする方法を教えていただけませんか。

    オカダ・システムエンジニアリング研究所

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: