2017-02-16 14 views
0

異種のオブジェクトを格納することを目的としたCollectionクラスがありますが、これらのクラスが共有する特定のメソッド名(例:ToString())を呼びたいと思います。で失敗MQLで未知のクラスのメソッドを呼び出す方法は?

class Collection { 
    public: 
    void *data[]; 

    void Collection() {} 
    void ~Collection() { 
     for (int i = 0; i < ArraySize(data); i++) { 
     if (CheckPointer(data[i]) == POINTER_DYNAMIC) delete data[i]; 
     } 
    } 

    void *Add(void *_object) { 
     uint _size = ArraySize(data); 
     ArrayResize(data, _size + 1, 100); 
     data[_size] = _object; 
     return _object; 
    } 

    string ToString(string _dlm = ",") { 
     string _out = ""; 
     for (int i = 0; i < ArraySize(data); i++) { 
     if (CheckPointer(data[i]) == POINTER_DYNAMIC) { 
      _out += ((void *) data[i]).ToString(); // @fixme: Syntax error. 
     } 
     } 
     return _out; 
    } 

}; 

しかし((void *) data[i]).ToString()構文を使用して::ここで

は私の試みです

'ToStringメソッド' - Collection.mqh

私は呼び出すことができますどのように

を定義されていないメンバ関数各格納されたオブジェクトのメソッドToString()

答えて

1

collection.toString()のようになるはずです。ここで、collectionclass Collectionのオブジェクトです。コレクションに追加する各オブジェクトは、この関数を実装する必要があります... toString()(またはこのメソッドのインターフェイス)をサポートするいくつかのスーパークラスについて言及し、正しいオブジェクトのみを追加することを確認するのは簡単でしょうか?これにより、実行時に予期しないエラーが発生することもありません。

CArrayObjは、ほとんどの機能を持っています。toString()またはその他の機能が必要な場合は、単純に基本クラスを拡張できます。おそらく、デフォルトのコレクションの唯一の欠点は、CObject継承されたオブジェクトを格納することだけです。

0

これは、すべてのクラスが同じ仮想メソッドを共有できるan abstract classを作成することで実現できます。

class Object { 
    public: 
    virtual string ToString() = NULL; 
}; 

class Foo : public Object { 
    public: 
    virtual string ToString() { 
     return "Foo"; 
    }; 
}; 

class Bar : public Object { 
    public: 
    virtual string ToString() { 
     return "Bar"; 
    }; 
}; 

そしてCollectionクラスの次のメソッド:

virtual string ToString(string _dlm = ",") { 
    string _out = ""; 
    for (int i = 0; i < ArraySize(data); i++) { 
    if (CheckPointer(data[i]) == POINTER_DYNAMIC) { 
     _out += ((Object *) data[i]).ToString() + _dlm; 
    } 
    } 
    return _out; 
} 

使用例:

Collection *objects; 
objects = new Collection; 
Foo *foo = new Foo(); 
Bar *bar = new Bar(); 
objects.Add(foo); 
objects.Add(bar); 
Print(objects.ToString()); 
delete objects; 
例えば
関連する問題