Class 如何在MQL中调用未知类的方法?

Class 如何在MQL中调用未知类的方法?,class,function-pointers,void-pointers,mql5,Class,Function Pointers,Void Pointers,Mql5,我有一个Collection类,其目的是存储不同类型的对象,但是我想调用这些类共享的特定方法名,例如ToString 以下是我的尝试: class Collection { public: void *data[]; void Collection() {} void ~Collection() { for (int i = 0; i < ArraySize(data); i++) { if (CheckPointer(data[i

我有一个Collection类,其目的是存储不同类型的对象,但是我想调用这些类共享的特定方法名,例如ToString

以下是我的尝试:

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方法?

在我看来,它应该类似于collection.ToString,其中collection是类集合的对象。然后,添加到集合中的每个对象都应该实现此功能。。。也许更容易提及一些支持toString或与此方法接口的超类,并确保只添加正确的对象?这也使您的代码在运行时没有意外错误


此外,CArrayObj也适用于大多数函数,如果您需要字符串或任何其他函数,那么您可以简单地扩展基本类。默认集合的唯一缺点可能是它存储CObject继承的对象。

这可以通过创建所有类都可以共享同一虚拟方法的位置来实现。例如:

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;