【问题标题】:How to use friend class in C++/CX?如何在 C++/CX 中使用朋友类?
【发布时间】:2013-04-04 08:43:06
【问题描述】:

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

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

我该如何解决呢?
P.S.:我不能在公共区域编写 get/set 函数,因为我不想让班级用户知道私人成员。

【问题讨论】:

    标签: windows-runtime c++-cx


    【解决方案1】:

    记住为什么你要声明一个 C++/CX ref class,它是为了允许用另一种语言编写的程序使用你的 C++ 代码。这种语言不会有任何friend 关键字的概念,它高度特定于C++ 语言。只有 C++ 编译器能够执行友元契约。事实上,当客户端代码是用 C# 编写时,CLR 会强制执行可访问性。因此,您的项目生成的 .winmd 文件的元数据格式根本不支持表达 friend 的概念。所以编译器也不会。

    首先检查以确保您正确使用了 C++/CX,如果您确实打算让其他语言可以访问该类,请仅使用 ref class 关键字。如果该类仅由您自己的代码使用,请使用普通的 C++ 类,即不带 ref 上下文关键字的纯 class。如果它真的打算用作互操作类,那么您将别无选择,只能将成员公开。

    【讨论】:

    • 我构建了 Windows 运行时组件项目来包装我用 c++ 编写的 sdk 接口,供 C# UI 项目调用 windows 商店,所以我确实需要 C++/CX 来完成这项工作。
    • 现在我知道 "friend" 不能在 C++/CX 中使用,我曾尝试使用 "map" 来保持关系,它似乎工作到现在。感谢您的回答。
    • @Hanqing friend 可以在C++/CX中使用,只是不能在ref class中使用。
    【解决方案2】:

    访问说明符是防止意外访问的预防措施,因此特定选择 CX 朋友的 std C++ 和 stl 性能 - 例如持有 xaml 绑定数据上下文容器 - 是简单的方法。无论出于何种原因,VC++ 都是种族主义者。河。吨。 WinRT ABI 通过 OOP 混合。一种已知的替代方法是切换到生成元编程而不是 OO。为此,将模板成员函数保留在想要与消费者成为朋友的类中,并将其专门化在消费者的范围内,然后从消费者内部使用专门的版本。它有点隐藏在微软家族的友谊事件中。

    【讨论】:

      【解决方案3】:

      你可以通过使用来解决这个问题

      friend ref class Class2;
      

      而不是

      friend class Class2
      

      【讨论】:

        猜你喜欢
        • 2010-10-06
        • 2010-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-04
        相关资源
        最近更新 更多