0

我有一个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()为每个存储的对象调用方法?

4

2 回答 2

1

在我看来,它应该类似于collection.toString()where collectionis a object of your class Collection. 然后你添加到你的集合中的每个对象都应该实现这个功能......也许更容易提到一些支持toString()(或与这个方法接口)的超类并确保你只添加正确的对象?这也使您的代码在运行时不会出现意外错误。

大多数功能也可供您CArrayObj使用,如果您需要或任何其他功能,那么您可以简单地扩展基本类。默认集合的唯一缺点可能是它存储了继承的对象。toString()CObject

于 2017-02-17T00:13:54.790 回答
0

这可以通过创建一个抽象类来实现,其中所有类都可以共享相同的虚拟方法。例如:

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;
于 2017-02-17T23:30:49.607 回答