朋友裁判课?

Aja*_*jay 3 .net dll mixed-mode c++-cli friend

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

问题是我想Parser访问的所有成员CParser。我不想public:让所有成员都使用,也不愿意有二传手。因此,我只放置了friend关键字:

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

// public ref class Parser{}; 
Run Code Online (Sandbox Code Playgroud)

我收到错误消息C2144,可能是由于非托管C ++无法理解ref关键字的明显原因。如果删除ref关键字,则托管编译器(compiling Parser)将抱怨并出现错误C2872:Ambigious Symbol。

还众所周知,internal:它不适用于未管理的C ++。

如何结交Parser的朋友CParser

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

Tim*_*ter 5

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

这很丑陋,但是至少丑陋隐藏在cpp文件中,并且本机类的公共接口仍然相对干净。

本机类

class NativeClass
{
public:
        void PublicStuff();
        struct DispatchHelper;
protected:
        friend DispatchHelper;
        void NonPublicStuff();
};
Run Code Online (Sandbox Code Playgroud)

引用类

ref class RefClass
{
public:
    void ManagedCode();
};
Run Code Online (Sandbox Code Playgroud)

RefClass.cpp

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

void RefClass::ManagedCode()
{
    NativeClass::DispatchHelper::DoStuff(pNativeClass);
}
Run Code Online (Sandbox Code Playgroud)