C++/Cx Tutorial 1: Fundamental Type, Class, dan Property

C++/Cx (Component Extensions) adalah extension dari Microsoft C++ compilers yang memungkinkan C++ programmers untuk menulis program di atas WinRT. Sintaks dan library-nya berbasis model pemrograman WinRT (COM) dan penting untuk memahami bahwa walaupun C++/Cx mirip sekali dengan C++/CLI, infrastrukturnya sangat berbeda dengan CLR, karena compiler C++/Cx akan menghasilkan native code (x64, ARM, tergantung target device), bukan .NET assembly.

Penggunaan C++/Cx untuk Metro style apps, biasanya untuk:

  • Membuat DLL (Windows Runtime components) yang dapat digunakan oleh Metro style apps yang ditulis dengan JavaScript+HTML atau C#+XAML.
  • Membuat logic aplikasi Metro style, informasi kultural dan sensor-based data, dan menggunakan XAML untuk UI.
  • Membuat game, graphics, hardware-dependent, intensif komputasi untuk high performance app, seperti DirectX, Parallel Patterns Library, dan C++ AMP.
  • Reuse code/libraries yang pernah ditulis dengan C++.

Artikel ini akan membahas bahasa dan model pemrograman C++/Cx. Saya berasumsi bahwa pembaca pernah mengenal bahasa pemrograman C++ sebelumnya.

C++/Cx Fundamental Type

Setelah memberi contoh “Hello World”, biasanya semua buku pemrograman membahas type. Berikut ini adalah quick reference untuk type mapping dari Standard C++ ke C++/Cx. Saya tidak akan membahas semua, hanya yang terkait. Jangan buang buku C++ anda dirumah karena masih akan sangat berguna. C++/CX mendukung type system yang didefinisikan dalam arsitektur WinRT yang mendukung data types dan functions yang dapat dipanggil dari bahasa pemrograman lainnya seperti C#, JS dan VB. Perbandingan fundamental type di Standard C++ dan C++/Cx dapat anda peroleh disini. Beberapa type yang baru seperti:

image

Type lainnya seperti Array, Anum, Class, Struct, dan Interface juga didukung dalam C++/Cx, tetapi yang menarik adalah, C++/Cx mendukung delegate untuk menggantikan function pointer, event, collection dari event handlers (delegate), property dan generics. Fitur-fitur ini membuat pemrograman dalam C++/Cx seperti layaknya dalam C# dan VB.NET.

Seperti biasa, jangan menghapal fundamental types, yang perlu anda mengerti adalah konsep penggunaannya dan jika anda cukup “geeky” pelajari internal works nya dengan mempelajari WinRT metadata-nya via ILDASM.

 

Class dan Structure

C++/Cx mendukung user-defined reference classes dan structs seperti halnya C++ standard. Akan tetapi, accessibility public dari type ini dapat dilewatkan melalui WinRT komponen dan apps, sementara standard C++ classes dan structs tidak bisa. Ini yang menjadi bagian yang sangat menarik. Banyak sekali physics engine, game engine, numerical library, dan library lainnya yang masih ditulis dengan C++, yang tentu saja dapat digunakan dengan modern UX menggunakan XAML atau HTML5.

Untuk mendeklarasikan class (ref class), gunakan ref class contextual keyword. Suatu ref class dapat berisi function yang bersifat public, protected, dan private , data members, dan nested classes. Secara default, accessibility adalah private. Suatu reference struct (ref struct) sama seperti ref class, tetapi ref struct mendeklarasikan suatu ref class yang secara default bersifat public accessibility.
 
Kita dapat meninstansiasi ref class atau ref struct jika memiliki paling tidak satu implicit atau explicit public constructor. Kita juga dapat dengan mudah menggabungkan standard C++ types dan functions dalam suatu ref class. Meskipun demikian dalam WinRT komponen, kita hanya dapat melewatkan public ref classes, ref structs, value structs, dan value classes.
 

Sintaks untuk deklarasi ref class dan ref struct adalah sebagai berikut. Jika type tersebut public, harus di sealed agar tidak dapat di inherit.


ref class identifier sealed{}

ref struct identifier sealed{}

Contoh penulisan deklarasi untuk HackathonParticipant ref class adalah:

 

#pragma once

using namespace std;
#include<map>

namespace CPPCX01
{
ref class HackathonParticipant sealed
{
public:
  typedef Windows::Foundation::Collections::IMapView<Platform::String^, Platform::String^> NumbersView;
  HackathonParticipant(Platform::String^ name);
  void AddPhoneNumber(Platform::String^ type, Platform::String^ number);
  property NumbersView^ PhoneNumbers
  {
    NumbersView^ get();
  }
private:
  Platform::String^ name_;
  std::map<Platform::String^, Platform::String^> numbers_;
};

}

Dalam ref class HackathonParticipant didefinisikan type NumbersViews dari IMapView interface untuk menampung property PhoneNumbers dari peserta Hackathon di jogja. Perhatikan bahwa type standard C++ std::map digunakan dalam private members, dan WinRT C++/Cx IMapView interface digunakan dalam public interface. Juga perhatikan bagaimana handle-to-object modifier (^) digunakan dalam deklarasi reference type.

Dalam WinRT type system, ref class dan and ref struct adalah reference type. Reference type diimplementasikan sebagai reference-counted pointers ke WinRT objects (COM). C++/CX secara otomatis merubah reference count (ref count) dari suatu object ketika di instantiasi di copy, di set ke null atau lainnya. Ketika reference count menjadi nol, object destructor dipanggil seperti halnya dalam program C++ lain. Tidak ada mekanisme GC dalam C++/CX
 

Contoh implementasi ref class HackathonParticipant akan menjadi seperti berikut:

// WinRTComponent.cpp
#include "pch.h"
#include "WinRTComponent.h"
#include<map>
#include<collection.h>

using namespace CPPCX01;
using namespace Platform;

HackathonParticipant::HackathonParticipant(Platform::String^ name): name_(name) { }
void HackathonParticipant::AddPhoneNumber(Platform::String^ type, Platform::String^ number)
{
   numbers_[type] = number;
}
HackathonParticipant::NumbersView^ HackathonParticipant::PhoneNumbers::get()
{
    return ref new Platform::Collections::MapView<Platform::String^, Platform::String^>(numbers_);
}

Untuk menggunakan class tersebut dalam C++,

using namespace Platform;

HackathonParticipant^ p = ref new HackathonParticipant("Risman Adnan");
p->AddPhoneNumber("Home", "021-78880000");
p->AddPhoneNumber("Work", "021-25518100");
String^ workphone = p->PhoneNumbers->Lookup("Work");

Pada contoh tersebut kita gunakan ref new expression untuk membuat reference-counted WinRT object. Kita menggunakan simbol ^ symbol sebagai pengganti pointer de-reference operator (*) ketika mendeklarasikan variable, tetapi menggunakan operator –> untuk mengakses anggota object. Kita tidak memanggil delete secara eksplisit pada object karena WinRT secara otomatis menghapus object ketika copy terakhir dimemory menjadi out of scope. Pada low level, WinRT object pada dasarnya adalah COM object yang dimiliki oleh suatu “smart pointer”.

Standard C++ library (STL) dan Parallel pattern library dapat digunakan dengan baik di C++/Cx. Sebagian dari Win32 masih dapat digunakan, tetapi ada beberapa APIs yang tidak relevan di WinRT. Untuk 3rd party library atau library anda sendiri, perlu diperhatikan beberapa Win32 Call yang tidak relevan di WinRT object. Daftar Win32 API yang dapat digunakan pada Metro style app dapat diperoleh disini.

 

Pada Windows 8 Hackathon yang akan diadakan di Jogjakarta Mei 16-17, rekan-rekan akan belajar lebih banyak mengenai WinRT dan C++/Cx. Untuk mendaftarkan diri anda, klik gambar berikut ini.

Web Banner Windows 8 Hackathon

Semoga tutorial ini bermanfaat.

 

Ciao – Risman Adnan

Share this post: | | | |
Published Sunday, May 6, 2012 12:56 AM by Risman Adnan Mattotorang

Comments

No Comments