2017-02-16 95 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()其中collection是您的class Collection的一個對象。然後,添加到集合中的每個對象都應該實現此功能......也許更容易提及一些支持toString()(或與此方法接口)的超類,並確保只添加正確的對象?這也使得你的代碼在運行時沒有意外的錯誤。

另外CArrayObjat your disposal與大部分功能,如果你需要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; 
相關問題