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()과 같아야합니다. collection은 (는) class 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; 
예를 들어