我需要在B类的函数中访问A类的私有成员,我想使用友元类。但是,它似乎不能用作c ++方式。
“错误C3816”类Class2先前已使用不同的WinRT修饰符声明或定义
我该如何解决? P.S。:我不能在公共区域写get / set函数,因为我不希望类用户知道私有成员。
答案 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