C++ c++/多态本机类的cli包装器

C++ c++/多态本机类的cli包装器,c++,casting,c++-cli,polymorphism,wrapper,C++,Casting,C++ Cli,Polymorphism,Wrapper,我们正在为多态的本机代码编写一个c++/cli包装器,并希望尽可能将多态性扩展到非本机端。到目前为止,给定一个c++/cli类实例很容易检索底层的本机类,但当试图确定要为给定的本机类实例使用哪个c++/cli包装器时,麻烦就来了。在这里避免switch语句会很好,但是如何避免呢?有没有更优雅的面向对象解决方案 注意,在下面的代码中,我对C++/CLI类型使用了前缀M(例如,FresnelScatterer是一个本机类,而MFresnelScatterer是它的C++/CLI包装类) 本机C++基

我们正在为多态的本机代码编写一个c++/cli包装器,并希望尽可能将多态性扩展到非本机端。到目前为止,给定一个c++/cli类实例很容易检索底层的本机类,但当试图确定要为给定的本机类实例使用哪个c++/cli包装器时,麻烦就来了。在这里避免switch语句会很好,但是如何避免呢?有没有更优雅的面向对象解决方案

注意,在下面的代码中,我对C++/CLI类型使用了前缀M(例如,FresnelScatterer是一个本机类,而MFresnelScatterer是它的C++/CLI包装类)

本机C++基础类和继承类:

class Scatterer
{
public:
    ScatterType Type;

Scatterer() {}
virtual ~Scatterer() {}

ScatterType GetType() { return Type; }
    // Some virtual functions here...
};
class FresnelScatterer : public Scatterer
{
public:
// virtual function overrides
};
public ref class MScatterer abstract
{
public:
Scatterer* m_Scatterer;

MScatterer() {}

MScatterer(MScatterer% mscatter)
{
    m_Scatterer = mscatter.m_Scatterer;
}

MScatterer(Scatterer* scatter)
{
    m_Scatterer = scatter;
}

[XmlElement("The_Scatterer_Type")]
int ScattererType;

virtual void initializeXMLdata()
{
    ScattererType = (int) m_Scatterer->GetType();
}

virtual Scatterer* convertXMLdata() = 0;

~MScatterer() { }
// more wrapping here
};

public ref class MFresnelScatterer : MScatterer
{
public:
    MFresnelScatterer() : MScatterer() {}


    MFresnelScatterer(MFresnelScatterer% mfscatter) : MScatterer(mfscatter)
    {
    };

    MFresnelScatterer(FresnelScatterer* mfscatter) : MScatterer(mfscatter)
    {
    };

    virtual void initializeXMLdata() override
    {
        MScatterer::initializeXMLdata();
                    // other init
    }

    virtual Scatterer* convertXMLdata() override
    {
        //Scatterer
        FresnelScatterer* sca = new FresnelScatterer();
        return sca;
    }

};
c++/cli基类和继承的类:

class Scatterer
{
public:
    ScatterType Type;

Scatterer() {}
virtual ~Scatterer() {}

ScatterType GetType() { return Type; }
    // Some virtual functions here...
};
class FresnelScatterer : public Scatterer
{
public:
// virtual function overrides
};
public ref class MScatterer abstract
{
public:
Scatterer* m_Scatterer;

MScatterer() {}

MScatterer(MScatterer% mscatter)
{
    m_Scatterer = mscatter.m_Scatterer;
}

MScatterer(Scatterer* scatter)
{
    m_Scatterer = scatter;
}

[XmlElement("The_Scatterer_Type")]
int ScattererType;

virtual void initializeXMLdata()
{
    ScattererType = (int) m_Scatterer->GetType();
}

virtual Scatterer* convertXMLdata() = 0;

~MScatterer() { }
// more wrapping here
};

public ref class MFresnelScatterer : MScatterer
{
public:
    MFresnelScatterer() : MScatterer() {}


    MFresnelScatterer(MFresnelScatterer% mfscatter) : MScatterer(mfscatter)
    {
    };

    MFresnelScatterer(FresnelScatterer* mfscatter) : MScatterer(mfscatter)
    {
    };

    virtual void initializeXMLdata() override
    {
        MScatterer::initializeXMLdata();
                    // other init
    }

    virtual Scatterer* convertXMLdata() override
    {
        //Scatterer
        FresnelScatterer* sca = new FresnelScatterer();
        return sca;
    }

};

从C++到CLI>本地C++的例子很好,这里是:

for each ( MScatterer^ mScatterer in readScene->ScattererList)
{
    m_Scene->scattererList.push_back(mScatterer->convertXMLdata());
}
<>但是从本地C++中,我看不到如何教我的原生对象的C++ +CLI不使用开关语句:

for (uint i=0; i<m_Scene->scattererList.size(); i++)
{
    switch (m_Scene->scattererList[i]->GetType())
    {
    case SCA_FRESNEL:
        {
            MFresnelScatterer^ sca = gcnew MFresnelScatterer((FresnelScatterer*) m_Scene->scattererList[i]);
            sca->initializeXMLdata();
            ScattererList->Add(sca);
            break;
        }
    // other cases follow...
    }
}
for(uint i=0;isCatterList.size();i++)
{
开关(m_Scene->scatterlist[i]->GetType()
{
案例SCA_FRESNEL:
{
MFresnelScatterer^sca=gcnew MFresnelScatterer((FresnelScatterer*)m_场景->散射列表[i]);
sca->初始化EXMLDATA();
散射列表->添加(sca);
打破
}
//其他案例如下。。。
}
}

您可以在
MScatterer
中编写一个虚拟方法
CreateObject
,并在派生类中实现它。被重写的
CreateObject
将创建目标类的实例。不需要有
GetType
方法。

CreateObject()应该创建什么?C++/CLI类?在C++本地类中,这是不可能的。C++原生类?为什么?您已经有了一个。好的,我想您建议添加
virtualmscatterer^CreateObject(scatter*input)=0到MScatterer,然后在派生类中实现它,例如:
virtualMSCatterer^CreateObject(scatter*input)override{…}
,但是程序如何知道哪个派生类与输入匹配?不。我建议
MScatterer::CreateObject
,其返回类型将是MScatterer^/MScatterer*。没有必要争论。我遗漏了什么吗?我需要为本机对象创建一个具有相应类型的C++/CLI包装器。因此,如果我有一个FresnelScatterer类型的本机对象,那么我想创建一个MFresnelScatterer类型的C++/CLI包装器来存储本机指针。我希望这对于任何派生的scatter类都是通用的。我已经尝试过,并且可以在本机类中编写托管内容(在
scatter
中):
mscaterer^Create(){return gcnew mscatterer;}
。您需要向前声明所需的类。