C++/CX

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

C++/CX (Component Extensions) — расширения языка C++, реализованные в компиляторах от Microsoft. Позволяют писать программы на языке C++ для новой платформы Windows Runtime (WinRT). Они привносят синтаксические и библиотечные абстракции, которые работают с программной моделью COM WinRT в естественном для программистов на C++ стиле.

Синтаксис схож с использовавшимся в C++/CLI, но программы на C++/CX работают на Windows Runtime и компилируются в машинный код, а не на Common Language Runtime и байт-код managed code.

Синтаксис расширений[править | править викитекст]

В C++/CX вводятся синтаксические расширения для программирования для Windows Runtime. Общий платформенно-независимый синтаксис совместим с стандартом C++11.

Объекты[править | править викитекст]

Объекты WinRT создаются (активируются) при помощи ref new и присваиваются к переменным, объявленным с нотацией ^, унаследованной от C++/CLI.

Foo^ foo = ref new Foo();

Переменная WinRT представляет собой пару указателей: указатель на таблицу виртуальных методов и указатель на внутренние данные объекта.

Подсчет ссылок[править | править викитекст]

Объекты WinRT используют подсчет ссылок и ведут себя сходно с обычными объектами C++, используемыми с умными указателями (shared_ptr). Объект подлежит удалению, когда на него не будет вести ни одной ссылки.

Сборка мусора не осуществляется, однако ключевое слово gcnew было зарезервировано для возможного использования в будущем.

Классы[править | править викитекст]

Классы Runtime[править | править викитекст]

Специальный тип runtime классов, которые могут содержать в себе конструкции расширяющие компонент. Иногда их называют классы ref, так как они объявляются с помощью конструкции ref class:

public ref class MyClass
{
 
};
Частичные классы[править | править викитекст]

C++/CX вводит концепт частичных классов (partial classes). С их применением возможно определить один класс по частям в нескольких файлах с исходными текстами. Например, они могут использоваться для реализации генераторов кода для GUI XAML. Во время компиляции части класса объединяются в единый класс.

Языки .NET, такие как C# поддерживали такое много лет. Однако они не вошли в стандарт C++ 2011 года и не могут использоваться в «чистом» C++11.

Файл, сгенерированный и обновляемый дизайнером GUI, не должен изменяться программистом вручную. Обратите внимание на использование ключевого слово partial.

// foo.private.h
#pragma once
 
partial ref class foo
{
private:
   int id_;
   Platform::String^ name_;
};

Файл, в котором программист описывает логику пользовательского интерфейса. Заголовочный файл, сгенерированный ранее, подключается через include. В данном файл ключевое слово partial не нужно.

// foo.public.h
#pragma once
#include "foo.private.h"
 
ref class foo
{
public:
   int GetId();
   Platform::String^ GetName();
};

В этом файле показана реализация членов частичного класса.

// foo.cpp
#include "pch.h"
#include "foo.public.h"
 
int foo::GetId() {return id_;}
Platform::String^ foo::GetName {return name_;}

Generics[править | править викитекст]

Windows Runtime и, следовательно, C++/CX поддерживают runtime generics. Информация об обобщенных типах сохраняется в метаданных и инстанциируется во время исполнения (в отличие от классических шаблонов C++, которые обрабатываются в момент компиляции).

generic<typename T> 
public ref class bag 
{
     property T Item;
};

Метаданные[править | править викитекст]

Все WinRT программы описывают объявленные в них классы и их члены через метаданные. Их формат совпадает с форматом метаданных Common Language Infrastructure (CLI), который был создан для .NET Framework. Благодаря этому возможно комбинирование кодов, написанных на C++/CX, языках CLI и на Javascript.

Библиотека Runtime[править | править викитекст]

C++/CX имеет набор библиотек, предназначенных для работы с Windows Runtime. Они реализуют интеграцию функциональности C++ STL и WinRT.

См. также[править | править викитекст]

Примечания[править | править викитекст]

Ссылки[править | править викитекст]