朋友参考班?

时间:2013-04-02 05:08:53

标签: .net dll c++-cli friend mixed-mode

我有一个托管类Parser和一个非托管类CParser。前者是从受管客户端的DLL(C#world)公开的。核心功能位于非托管类CParser中。由于两者都在同一个DLL中,并且存在一对一的关系,因此托管类可以访问非托管类。

问题是我希望Parser访问CParser的所有成员。我不想对所有成员使用public:,我也不愿意让我们有所有成员。因此,我刚刚放置了friend关键字:

class CParser
{
   ...
   friend ref class Parser; // C2144
};

// public ref class Parser{}; 

我收到错误C2144,可能是因为非托管C ++不理解ref关键字。如果我删除ref关键字,托管编译器(编译Parser)会抱怨错误C2872:Ambigious Symbol。

众所周知,internal:不适用于无人值守的C ++。

如何让Parser成为CParser的朋友?

编辑: 这个问题已经here,但是非托管类可能是在/clr下编译的。我不能/不会使用托管编译器编译非托管类。

1 个答案:

答案 0 :(得分:5)

在这种情况下,您无法使用friend。我找到完成它的唯一方法是声明另一个朋友,它可以自由访问私有成员,但是在另一个类的源文件中定义,因此不能被任何其他代码使用。

这是以自己的方式丑陋但至少丑陋隐藏在cpp文件中,并且本机类的公共接口保持相对干净。

NativeClass.h

class NativeClass
{
public:
        void PublicStuff();
        struct DispatchHelper;
protected:
        friend DispatchHelper;
        void NonPublicStuff();
};

RefClass.h

ref class RefClass
{
public:
    void ManagedCode();
};

RefClass.cpp

struct NativeClass::DispatchHelper
{
    static void DoStuff(NativeClass* p) { p->NonPublicStuff(); }
}

void RefClass::ManagedCode()
{
    NativeClass::DispatchHelper::DoStuff(pNativeClass);
}