C++ 为什么属性不能在ref类中公开

C++ 为什么属性不能在ref类中公开,c++,pointers,direct3d,c++-cx,C++,Pointers,Direct3d,C++ Cx,以下代码是非法的(Visual Studio 2012 Windows Phone(创建Windows Phone direct3d应用)) 标题 ref class Placement sealed { public: Placement( float rotX, float rotY, float rotZ, float posX, float posY, float posZ

以下代码是非法的(Visual Studio 2012 Windows Phone(创建Windows Phone direct3d应用))

标题

ref class Placement sealed
{
public:
    Placement(
        float rotX, 
        float rotY, 
        float rotZ, 
        float posX, 
        float posY, 
        float posZ
    );
    float rotX, rotY, rotZ, posX, posY, posZ;
};
Cpp

Placement::Placement(
        float rotX, 
        float rotY, 
        float rotZ, 
        float posX, 
        float posY, 
        float posZ
    )
    :   posX( posX ),
        posY( posY ),
        posZ( posZ )
{
    this->rotX = static_cast<float>(rotX);
    this->rotY = static_cast<float>(rotY);
    this->rotZ = static_cast<float>(rotZ);
}
Placement::Placement(
浮子旋转体,
浮子腐烂,
浮子罗兹,
浮动posX,
飘飘飘,
浮动posZ
)
:posX(posX),
波西(波西),
posZ(posZ)
{
此->rotX=静态施法(rotX);
此->旋转=静态旋转(旋转);
这->旋转=静态旋转(rotZ);
}
为什么以及如何设置属性?我习惯了普通的C++而不是C++(我想它是正确的)…我必须创建为属性服务的方法吗?

*这个问题源于我最初试图创建一个普通类并创建一个指向它的指针,结果却被抱怨说我不能使用*而是必须使用^。。。 我真的不明白为什么*


这与WinRT或更具体地说与ARM处理器有关吗?

这是WinRT和C++/CX扩展特有的。C++/CX不允许ref类包含公共字段。您需要将公共字段替换为公共字段


属性具有由编译器自动生成的getter和setter函数。

是COM中的一个限制,COM是WinRT和C++/CX语言扩展的基础。COM只允许在接口声明中使用纯虚拟方法。属性很好,它被模拟为getter和setter方法。不是一个领域

这种限制不是人为的,它强烈地删除了实现细节。当您需要支持任意语言并使它们相互通信或与API通信时,这一点非常重要。一个字段有一个非常糟糕的实现细节,它的位置非常依赖于实现。对齐和结构打包规则对于确定位置很重要,不能保证语言运行时之间的兼容性


使用属性是简单的解决方法。

所以我必须将我在桌面上创建的游戏的所有C++类转换为这些REF类,而将我的所有字段改为属性。这正是我必须为那些“可能”在RT上使用的游戏做的事情?顺便说一句,我试过这个代码,但它不喜欢。它附带一个编译错误:错误C2144:语法错误:“float”前面应该加“;”我必须删除逗号,并为每个属性重新写入属性浮动。奇怪?@JamesT-我甚至不确定单行声明的语法是否有效。我已经更新了我的答案,所以它可以编译了。谢谢,伙计,好吧。。。好了。。。我想我只是对这段代码感到困惑,因为我只为X86桌面PC编写了应用程序。。。我从来没有为RT编写过东西(这是一个不同的处理器,对吗?),如果我重新编写我的游戏并声明服务于私有数据的方法,这会很好,对吗?正如前面提到的,方法不是一个问题。汉斯,你的评论非常有用,它一直在我脑海中酝酿,我现在完全理解为什么C++CX的发展会发生。真的很感激,干杯,布拉。
Placement::Placement(
        float rotX, 
        float rotY, 
        float rotZ, 
        float posX, 
        float posY, 
        float posZ
    )
    :   posX( posX ),
        posY( posY ),
        posZ( posZ )
{
    this->rotX = static_cast<float>(rotX);
    this->rotY = static_cast<float>(rotY);
    this->rotZ = static_cast<float>(rotZ);
}
 ref class Placement sealed
{
public:
    Placement(
        float rotX, 
        float rotY, 
        float rotZ, 
        float posX, 
        float posY, 
        float posZ
    );
    property float rotX;
    property float rotY;
    property float rotZ;
    property float posX;
    property float posY;
    property float posZ;
};