2013-11-20 2 views
2

Следующий код является незаконным (Visual Studio 2012 Windows Phone (Создание Direct3D приложение Windows Phone))Почему свойства не быть публичным внутри класса исх запечатаны

a non-value type cannot have any public data members 'posX' 

Заголовок

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); 
} 

Почему и как мне установить свойства? Я привык к нормальному C++, а не C++ CX (я думаю, что это называется так?) ... Должен ли я создавать методы, которые обслуживают свойства?

* Эта проблема возникла из-за того, что я пытался создать нормальный класс и создать указатель на него, только для того, ref class вместо этого ... Я действительно не понимаю почему? *

Это как-то связано с WinRT или, более конкретно, с процессорами ARM?

ответ

4

Это специально для WinRT и C++/CX расширений. C++/CX не позволяет классам ref содержать общедоступные поля. Вам необходимо заменить общедоступные поля общедоступными properties.

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; 
}; 

Свойства имеют функции getter и setter, сгенерированные автоматически компилятором.

+0

Итак, мне нужно преобразовать все мои классы C++ для игры, которую я создал на рабочем столе, вместо этих классов ref и изменить allllll моих полей на свойства вместо этого? это именно то, что я должен делать для игр, которые «могут» использоваться на RT? – Jimmyt1988

+0

Кстати, я пробовал этот код, и ему это не нравится. Он поставляется с ошибкой компиляции: ошибка C2144: синтаксическая ошибка: «float» должен предшествовать ';' – Jimmyt1988

+0

Мне пришлось удалить запятые и переписать свойство float для каждого отдельного объекта. странно? – Jimmyt1988

6

Является ли ограничение в COM, основой WinRT и расширением языка C++/CX. COM допускает только чистые виртуальные методы в объявлениях интерфейса. Свойство прекрасно, это эмулируется как метод получения и метод сеттера. Не поле.

Этот вид ограничений не является искусственным, он сильно удаляет детали реализации. Очень важно, когда вам нужно поддерживать произвольные языки и заставить их говорить друг с другом или с API. Поле имеет очень неприятную деталь реализации, его местоположение очень зависит от реализации. Правила выравнивания и структуры упаковки важны для определения этого местоположения и не могут быть гарантированы совместимость между языковыми режимами.

Использование имущества - это обходное решение.

+0

Если я переписал свою игру и объявлю методы, которые обслуживают частные данные, это будет хорошо? – Jimmyt1988

+0

Как уже отмечалось, методы не являются проблемой. –

+0

Извините, да .. duhh. Благодарю. – Jimmyt1988

Смежные вопросы