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