如何包装静态实例?

时间:2014-02-19 21:02:51

标签: c++-cli

我正在使用Visual Studio 2012,使用C ++ Native Library并为它创建C ++ / CLI包装。

this回答后,我有一个类,其函数在C ++中返回静态实例,如下所示:

MyCppClass.h

class MyCppClass
{
private:
    MyCppClass(std::string name);
    ~MyCppClass(void);

public:                 

    static const MyCppClass& MyInstance1();
    static const MyCppClass& MyInstance2();     
};

MyCppClass.cpp中的实例方法

#include "MyCppClass.h"

const MyCppClass& MyCppClass::MyInstance1()
{       
    static const MyCppClass instance1("Instance1Name");
    return instance1;
}

const MyCppClass& MyCppClass::MyInstance2()
{       
    static const MyCppClass instance2("Instance2Name");
    return instance2;
}

我的C ++代码运行正常。现在我正在构建一个C ++ / CLI包装器,因此可以从C#访问所有这些功能。

我按照这种方式构建所有包装器: 我的Managed类包含一个指向非托管类的指针,我在适当的时候创建实例,并在析构函数上销毁它。我将来自C#的参数编组到C ++并使用C ++中的逻辑。

我想在C#中使用MyCppWrapper的静态实例,就像我在C ++中使用它们一样。我希望C ++ / CLI能够引用C ++的静态实例。

你是如何做到这一点的?

我尝试了不同的东西,但大多数都不会建造,最后我得到了这个:

MyWrapper.h

public ref class  MyWrapper
{
private:
    const MyCppClass * internalInstance;
    MyWrapper(const MyCppClass * internalInstance);
    ~MyWrapper(void);

static const MyWrapper^ instance1;
public:

    property static const MyWrapper^ Instance1
    {
        const MyWrapper^ get();
    }

MyWrapper.cpp

MyWrapper::~MyWrapper()
{
    //Should I delete the pointer??
}

MyWrapper::MyWrapper(const MyCppClass* instance)
{
    internalInstance= instance;
}

const MyWrapper^ MyWrapper::Instance1::get()
{
    if(instance1== nullptr)
    {
        instance1 = gcnew MyWrapper(&(MyCppClass::Instance1()));
    }

    return instance1;
}

这是我正在尝试做的正确方法吗?

我应该怎么处理 const MyCppClass * internalInstance; 指针,我认为我不能销毁它,因为它不是用new创建的,我可能搞砸了。

0 个答案:

没有答案