C++ MFC&x27;D中的s CRuntimeClass替换

C++ MFC&x27;D中的s CRuntimeClass替换,c++,mfc,d,C++,Mfc,D,堆栈溢出。我在这里的第一篇帖子。 我从C++和MFC来到D,我在工作中使用的不仅仅是GUI的东西,还有很多MFC的宏( DeCurryDyCudio< /Cuff>)和 Cbjtub> /Cord>类。 我看到,在D中,我们有std.Object类和factory方法 如何正确重写C++中的C++代码?当然,如果可能的话 class CPerson : public CObject { DECLARE_DYNAMIC( CPerson ) // other declaratio

堆栈溢出。我在这里的第一篇帖子。
我从C++和MFC来到D,我在工作中使用的不仅仅是GUI的东西,还有很多MFC的宏(<代码> DeCurryDyCudio< /Cuff>)和<代码> Cbjtub> /Cord>类。 我看到,在D中,我们有
std.Object
类和
factory
方法

如何正确重写C++中的C++代码?当然,如果可能的话

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);
class CPerson:公共对象
{
声明动态(CPerson)
//其他声明
};
实施动态(CPerson、CObject)
void DoSmthWithObject(const CObject*pObj)
{
CPerson*pPerson=动态_-cast(pObj);
ASSERT_VALID(perperson);
//与CPerson对象一起工作。
}
//代码中有人创建了我们的CObject。。。
CObject*pMyObject=新的CPerson;
// .. 用它做一些奇怪的事情。
DoSmthWithObject(pmyoobject);

已在运行时签入D。尝试执行无效的降级将导致空引用

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
}

你是ae图书馆的作者?有趣的项目,我检查了一些it代码。关于主题:如何在运行时确定
a
的实际类型?例如,在函数中,如
void DoSmth(A)
typeof
使用关于类型的编译时信息,因此它总是显示
A
。谢谢你的回答。啊哈。所以,再次感谢你,祝你的D项目好运——它们令人印象深刻。最后一个问题:D已经有编译时反射了。但是运行时1呢,比如Qt QMetaObject之类的东西?@Trass3r好的,现在清楚了。但是,我在哪里可以得到更多的信息呢?据我所知,traits+mixin已经允许在编译时向任何D类添加一些字段/成员函数信息(
Variant[string]fields
),并在运行时检索它。