1 Managed c++ (使用vs2002,2003,建立visual c++下的console application(.net ) project,project还有各种类型)
注: 此时的project setting里一定是 :using Managed Extenstions ->Yes
简单实例
#using <mscorlib.dll>
using namespace System;

__gc class G


{
public:
int k;
int sum(int);
};


G::sum(int i)
{return i*(i + 1)/2;}

int main()


{
G * g = new G;
Console::WriteLine(g->sum(4)); // 结果输出10
return 0;
} 接口实例
#using <mscorlib.dll>
using namespace System;


__gc __interface Ibase1
{
int f(int);
};

__gc __interface Ibase2
{
int f(int);
};

__gc struct C: Ibase1, Ibase2
{

int f(int i)
{ // 接口方法的实现
return 2*i-1;
};
};


int main(void)
{
C* c = new C;
Console::WriteLine((c -> f(1)).ToString()); // 输出结果为1
Console::WriteLine((__try_cast (c)->f(2)).ToString());
// 输出结果为3

Console::WriteLine((__try_cast (c)->f(3)).ToString());
// 输出结果为5

return 0;
}property实例:
#using <mscorlib.dll>
using namespace System;


__gc class G
{
public:

__property int get_Size()
{
Console::WriteLine(S"get_属性");
return nSize;
};

__property void set_Size(int i)
{
Console::WriteLine(S"set_属性");
nSize = i;
};
private:
int nSize;
};


int main()
{
G * pG = new G;
pG->Size = 10; // 调用set_Size
int i = pG->Size; // 调用get_Size
Console::WriteLine(i);
}

//程序结果为:

// set_属性

// get_属性

// 10

代理实例:
#using <mscorlib.dll>
using namespace System;

__delegate int GetDayOfWeek(); // 委派方法的声明
__gc class MyCalendar


{
public:

MyCalendar() : m_nDayOfWeek(4)
{}

int MyGetDayOfWeek()
{
Console::WriteLine("非静态方法");
return m_nDayOfWeek;
}

static int MyStaticGetDayOfWeek()
{
Console::WriteLine("静态方法");
return 6;
}
private:
int m_nDayOfWeek;
};

int main(void)


{
GetDayOfWeek * pGetDayOfWeek; // 声明委派类型变量
int nDayOfWeek;

// 将类的静态方法MyStaticGetDayOfWeek绑定成委派
pGetDayOfWeek = new GetDayOfWeek(0, &MyCalendar::MyStaticGetDayOfWeek);
nDayOfWeek = pGetDayOfWeek->Invoke(); // 委派的调用
Console::WriteLine(nDayOfWeek);

// 将一个类的实例绑定成委派
MyCalendar * pcal = new MyCalendar();
pGetDayOfWeek =
static_cast(Delegate::Combine(pGetDayOfWeek,
new GetDayOfWeek(pcal, &MyCalendar::MyGetDayOfWeek)));
nDayOfWeek = pGetDayOfWeek->Invoke();
Console::WriteLine(nDayOfWeek);

// 删除绑定委派的类实例
pGetDayOfWeek =
static_cast(Delegate::Remove(pGetDayOfWeek,
new GetDayOfWeek(pcal, &MyCalendar::MyGetDayOfWeek)));

return 0;
}


/**//* 输出结果是:

静态方法
6

静态方法

非静态方法

4*/2 c++\CLI (使用vs2005 ,之前的版本不支持,建立visual c++下的CLR Console Application ,当然还有其他的类型可选,比如CLR empty ...^_^,)
注:此时project setting 中common language runtime support : Common Language Runtime Support (/clr) ,此时的project中已经ref system....DLL,所以不用想上面那样#using <mscordll>
简单实例
#include "stdafx.h"
using namespace System;

int main(array<System::String ^> ^args)


{
String^ str = gcnew String("Hello World");
Object^ o1 = gcnew Object();
Console::WriteLine(str);
return 0;
}interface 实例
using namespace System;

interface class IDog


{
void Bark();
};

ref class Dog : IDog


{
public:
void Bark()

{
Console::WriteLine("Bow wow wow");
}
};

void _tmain()


{
Dog^ d = gcnew Dog();
d->Bark();
}property实例
ref class Base


{
public:
ref struct SBaseData

{
public:
SBaseData()

{
x = 10;
}
SBaseData(int n)

{
x = n;
}
int x;
};
private:
SBaseData^ _bd;
public:
Base()

{
_bd = gcnew SBaseData();
}
virtual property SBaseData^ Data

{
SBaseData^ get()

{
return _bd;
}
void set(SBaseData^ val)

{
_bd->x = val->x;
}
}
};
ref class Derived : Base

{
public:
ref struct SDerivedData : Base::SBaseData

{
public:
SDerivedData(int n1, int n2) : SBaseData(n1)

{
y = n2;
}
SDerivedData() : SBaseData()

{
y = 100;
}
int y;
};
private:
SDerivedData^ _bd;
public:
Derived()

{
_bd = gcnew SDerivedData();
}

virtual property SBaseData^ Data

{
SBaseData^ get() override //= Base::Data::get

{
return _bd;
}
void set(SBaseData^ val) override //= Base::Data::set

{
try

{
_bd->x = val->x;
_bd->y = safe_cast<SDerivedData^>(val)->y;
}
catch(System::InvalidCastException ^)

{
//log an error
}
}
}
virtual property SDerivedData^ SData

{
SDerivedData^ get()

{
return _bd;
}
void set(SDerivedData^ val)

{
_bd->x = val->x;
_bd->y = val->y;
}
}
};
int main(array<System::String ^> ^args)



{
Derived^ d = gcnew Derived;
//Base^ d = gcnew Derived; // error , y is not a member of Base class
int num = d->Data->x;
int num2 = d->SData->y;
System::Console::WriteLine(num);
System::Console::WriteLine(num2);
return 0;
}index实例
using namespace System;
using namespace System::Collections;
ref class R


{
private:
Hashtable^ h;
public:
R()

{
h = gcnew Hashtable();
}

//Named property
property int Age[String^]

{
protected:
int get(String^ s)

{
if(h->ContainsKey(s))

{
for each(DictionaryEntry de in h)

{
if(s->CompareTo(de.Key) == 0)
return (int)de.Value;
}
}
return 0;
}

void set(String^ s, int age)

{
h->Add(s,age);
}
}

//Default property
property int default[String^]

{
int get(String^ s)

{
return Age[s];
}

void set(String^ s, int age)

{
Age[s] = age;
}
}
};

int main(array<System::String ^> ^args)



{
R^ r = gcnew R();

r["Nish"] = 27;
r["Smitha"] = 15;
r["Chris"] = 21;
r["Don"] = 87;

Console::WriteLine(r["Nish"]);
Console::WriteLine(r["George"]);
Console::WriteLine(r["Smitha"]);
Console::WriteLine(r["Don"]);
Console::WriteLine(r["Bert"]);
return 0;
