Замена MFC CRuntimeClass в D - PullRequest
       0

Замена MFC CRuntimeClass в D

1 голос
/ 09 марта 2012

StackOverflow. Мой первый пост здесь.
Я пришел к D из C ++ и MFC, которые я использую в своей работе - не только GUI, но и многие макросы MFC (DECLARE_DYNCREATE и т. Д.) И класс CObject.
Как я видел, в D у нас есть std.Object класс с factory методом.

Итак, как правильно переписать этот код C ++ в D? если возможно, конечно.

class CPerson : public CObject 
{
    DECLARE_DYNAMIC( CPerson )
    // other declarations
};
IMPLEMENT_DYNAMIC( CPerson, CObject )
void DoSmthWithObject(const CObject* pObj)
{
    CPerson* pPerson = dynamic_cast<CPerson*>(pObj);
    ASSERT_VALID(pPerson);
    // Work with out CPerson object.
}

// Somethere in code create our CObject...
CObject* pMyObject = new CPerson;

// .. and do some strange things with it.
DoSmthWithObject(pMyObject);

1 Ответ

2 голосов
/ 09 марта 2012

Downcasts уже проверен во время выполнения в D. Попытка выполнить недопустимый downcast приведет к нулевой ссылке.

class A { }
class B : A { }
class C { }

unittest
{
    A a = new A();
    Object o = a;               // upcasts are implicit
    assert(o !is null);         // OK, all classes implicitly descend from Object
    assert(cast(A)o !is null);  // OK, same class
    assert(cast(B)o is null);   // Not allowed, B is subclass of A
    assert(cast(B)a is null);   // Ditto
    assert(cast(C)o is null);   // Not allowed, C is unrelated to A
    assert(cast(C)a is null);   // Ditto
    assert(cast(C)cast(void*)a !is null); // Use intermediate cast to
                                          // void* to bypass runtime checks
}
...