如果这是一个愚蠢的问题,请耐心等待,因为我最近开始学习C ++ / CX。我正在浏览value classes和ref classes上的MSDN文档,我遇到了这些例外情况:
因为值类或值结构的所有成员都是公共的并且被发送到元数据中,所以不允许使用标准C ++类型。
和
[ref class]可以包含作为成员的C ++ / CX构造或标量类型,例如enum class,ref class,float64等。它还可能包含标准C ++类型。 C ++ / CX构造可以具有公共,受保护,内部,私有或受保护的私有可访问性。公共或受保护的成员被发送到元数据。标准C ++类型必须具有私有,内部或受保护的私有可访问性,这可以防止它们被发送到元数据。
我的问题是:“C ++ / CX构造”和“标准C ++类型”的定义是什么?
如果我的猜测是正确的,C ++ / CX构造包括ref类和结构以及枚举类和结构,标准C ++类型包括int,bool,float,double等。是吗?
答案 0 :(得分:3)
当文档说“C ++ / CX构造”时,它意味着Windows运行时类型。使用C ++ / CX进行编程时,有两类类型:
C ++类型:C ++类型集包括您可以在普通C ++代码中使用的所有类型:基本类型(如int
或double
),枚举,指针,引用,类类型等
Windows运行时类型:这些类型可以跨Windows运行时ABI边界使用。这些包括引用类型(ref class
),Windows运行时值类型(value class
,数字类型,Windows运行时枚举等)和委托。
请注意,这些类别之间存在一些重叠:数字类型同时存在。
您可以在代码中的任何位置使用C ++类型,但除了您编写的任何公共组件的公共表面外。只能在Windows运行时ABI边界使用Windows运行时类型。例如:
public ref class C sealed
{
public:
// Ok: int is a fundamental WinRT type
void F(int x) { }
// Not ok: std::string is not a WinRT type
void G(std::string s) { }
private:
// Ok: _s is private; private members are implementation details, so you
// may use ordinary C++ types for private members.
std::string _s;
};
这两类类型并不是在C ++中构建Windows运行时组件所特有的:如果在.NET中构建组件,则可以使用特定于.NET的类型(例如,具体的泛型类型)和特定于.NET的构造(例如,通用方法),它们不是有效的Windows运行时类型。