5

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

问题是我想Parser访问CParser. 我不想public:为所有成员使用,也不愿意有setter和getter。因此,我只放置了friend关键字:

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

// public ref class Parser{}; 

我得到错误C2144,可能是由于非托管 C++ 不理解ref关键字的明显原因。如果我删除ref关键字,托管编译器(编译Parser)会报错 C2872: Ambigious Symbol。

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

如何交Parser朋友CParser

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

4

1 回答 1

6

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

这本身就是丑陋的,但至少丑陋隐藏在 cpp 文件中,并且原生类的公共接口保持相对干净。

NativeClass.h

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

参考类.h

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

参考类.cpp

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

void RefClass::ManagedCode()
{
    NativeClass::DispatchHelper::DoStuff(pNativeClass);
}
于 2013-05-22T22:35:04.783 回答