| |
实例解析C++/CLI之静态构造函数 |
|
时间: 2006-11-22 来自:天极yesky |
 |
|
解决方法
例2中为Point类的修订版本,非常明显,每个实例现在必须包含一个额外的字段(在此为ID),用以保存ID,在此选择的类型为int,虽然标准C++允许其最小为16位,但在CLI环境中,其至少为32位。如果以零开始,那么在ID重复之前,能表示20亿个不同的实例;当然,也能以负20亿开始,那么能表示的范围又将扩展一倍;倘若想要把ID字段再进行扩展,可使用类型long long int,那么至少能有64位,可以创建数不胜数的实例。那么ID为unsigned行吗?如果它的值不会输出到它的父类之外,是可以的,请记住一点,无符号整型与CLS不兼容。(还可选择System::Decimal,其可表示128位。)
例2:
using namespace System; using namespace System::IO;
public ref class Point { int x; int y; /*1*/ int ID;
/*2*/ static int nextAvailableID; /*3*/ static int GetNextAvailableID() { return nextAvailableID++; } /*4*/ static bool traceID = false; /*5*/ static String^ masterFileLocation;
/*6*/ static Point() { /*6a*/ AppDomain^ appDom = AppDomain::CurrentDomain; /*6b*/ masterFileLocation = String::Concat(appDom->BaseDirectory, "\PointID.txt"); /*6c*/ try { /*6d*/ StreamReader^ inStream = File::OpenText(masterFileLocation); /*6e*/ String^ s = inStream->ReadLine(); /*6f*/ nextAvailableID = Int32::Parse(s); /*6g*/ inStream->Close();
/*6h*/ appDom->ProcessExit += gcnew EventHandler(&Point::ProcessExitHandler); } /*6i*/ catch (FileNotFoundException^ ioFNFEx) { //采取某些必要的措施 } /*6j*/ finally { appDom = nullptr; } }
/*7*/ static void ProcessExitHandler(Object^ sender, EventArgs^ e) { /*7a*/ StreamWriter^ outStream = File::CreateText(masterFileLocation); /*7b*/ outStream->WriteLine("{0}", nextAvailableID); /*7c*/ outStream->Close(); } public:
// ...
/*8*/ static property bool TraceID { bool get() { return traceID; } void set(bool val) { traceID = val; } }
// define instance constructors
Point() { /*9*/ ID = GetNextAvailableID(); X = 0; Y = 0; }
Point(int xor, int yor) { /*10*/ ID = GetNextAvailableID(); X = xor; Y = yor; }
Point(Point% p) // copy constructor { /*11*/ ID = GetNextAvailableID(); X = p.X; Y = p.Y; }
// ...
/*12*/ virtual int GetHashCode() override { // ... }
virtual String^ ToString() override { /*13*/ if (traceID) { return String::Format("[{0}]({1},{2})", ID, X, Y); } else { return String::Format("({0},{1})", X, Y); } } }; | 一旦作为static,标号2至5中定义的成员属于类,而不属于任何实例;而作为private,它们只是一个实现的细节。
|
|
|
|
|
|
|
|