如何在C ++ / CX中使用友元类?

时间:2013-04-04 08:43:06

标签: windows-runtime c++-cx

我需要在B类的函数中访问A类的私有成员,我想使用友元类。但是,它似乎不能用作c ++方式。

  

“错误C3816”类Class2先前已使用不同的WinRT修饰符声明或定义

我该如何解决? P.S。:我不能在公共区域写get / set函数,因为我不希望类用户知道私有成员。

3 个答案:

答案 0 :(得分:1)

请记住为什么您声明了C ++ / CX ref class ,它是允许用其他语言编写的程序使用您的C ++代码。这种语言不具有 friend 关键字的任何概念,它对C ++语言非常具体。只有C ++编译器才能执行好友合同。事实上,当客户端代码是用C#编写时,CLR会强制执行辅助功能。因此,项目生成的.winmd文件的元数据格式根本不支持表达 friend 的概念。所以编译器也没有。

首先检查以确保您正确使用C ++ / CX,如果您确实打算让其他语言可以访问该类,请仅使用 ref class 关键字。如果该类仅由您自己的代码使用,则使用常规C ++类,简单而不使用 ref 上下文关键字。如果真的打算用作互操作类,那么你将没有其他选择,只能让会员公开。

答案 1 :(得分:0)

访问说明符是预防性的,以防止意外访问,因此标准C ++&特定选择CX朋友的stl性能 - 比如持有xaml绑定datacontext容器 - 是一种简单的方法。无论出于何种原因,VC ++都是种族主义者。河吨。 WinRT ABI通过OOP混合。一种已知的替代方案是切换到生成元编程而不是OO。为此,请将模板成员函数保留在要与使用者成为朋友的类中,并在消费者的范围内对其进行专门化,然后再使用消费者中的专用版本。它隐藏在微软家庭的友谊之中。

答案 2 :(得分:0)

您可以使用

解决此问题
friend ref class Class2;

而不是

friend class Class2