Class 如何在MQL中调用未知类的方法?
我有一个Collection类,其目的是存储不同类型的对象,但是我想调用这些类共享的特定方法名,例如ToString 以下是我的尝试: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
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;