我需要在 B 类的函数中访问 A 类的私有成员,并且我想使用朋友类。但是,它似乎不能用作 c++ 方式。
“错误 C3816”类 Class2 先前已使用不同的 WinRT 修饰符声明或定义
我该怎么做才能解决它?
PS:我不能在公共区域写get/set函数,因为我不想让班级用户知道私人成员。
我需要在 B 类的函数中访问 A 类的私有成员,并且我想使用朋友类。但是,它似乎不能用作 c++ 方式。
“错误 C3816”类 Class2 先前已使用不同的 WinRT 修饰符声明或定义
我该怎么做才能解决它?
PS:我不能在公共区域写get/set函数,因为我不想让班级用户知道私人成员。
请记住为什么要声明 C++/CX引用类,它是为了允许用另一种语言编写的程序使用您的 C++ 代码。这种语言没有任何friend关键字的概念,它高度特定于C++语言。只有 C++ 编译器能够执行友元契约。事实上,当客户端代码是用 C# 编写时,CLR 会强制执行可访问性。因此,您的项目生成的 .winmd 文件的元数据格式根本不支持表达朋友的概念。所以编译器也不会。
首先检查以确保您正确使用了 C++/CX,如果您确实打算让其他语言可以访问该类,则仅使用ref class关键字。如果该类仅由您自己的代码使用,请使用常规 C++ 类,即不带ref上下文关键字的普通类。如果它真的打算用作互操作类,那么您将别无选择,只能将成员公开。
访问说明符是预防性的,以防止意外访问,因此特定选择 CX 朋友的 std C++ 和 stl 性能 - 例如持有 xaml 绑定数据上下文容器 - 是简单的方法。无论出于何种原因,VC++ 都是通过 OOP 混合的 WinRT ABI 的种族主义者。一种已知的替代方法是切换到生成元编程而不是 OO。为此,将模板成员函数保留在想要与消费者成为朋友的类中,并将其专门化在消费者的范围内,然后从消费者内部使用专门的版本。它有点隐藏在微软家族的友谊事件中。
您可以通过使用解决此问题
friend ref class Class2;
代替
friend class Class2