我有一个托管类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
下编译的。我不能/不会使用托管编译器编译非托管类。
答案 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);
}