科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件实例解析C++/CLI之静态构造函数

实例解析C++/CLI之静态构造函数

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

就某些类而言,当在程序中第一次使用时,最好能有一个初始化过程;当程序不再需要时,也最好能做一些收尾工作,这些都是非常好的类设计习惯。

作者:谢启东编译 来源:天极开发 2007年11月12日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
解决方法

  例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,它们只是一个实现的细节。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章