c++仿c#.net Sql类的实现

.net的产能,c++的效率,一切尽在Qt C++!

好,广告结束,众所周知,c#.net在软件工程性方面出类拔萃,让一众码农爽的嗷嗷叫。但是一谈到跨平台,运行时高效率,似乎就不则么行了,怎么办?

让C++来拯救世界吧(扯淡,.net和java不就是用c++做的么,好吧,我其实是喊个广告词而已)

实际上本文旨在通过一些目的性开发来科普一下c++的概念,高手请绕道。


在c#.net中我们知道数据库sql应用中有很多类,例如Table类,Recored类。

这里有一个有趣的特性,你不能简单的直接做出一个Record对象来,而是需要依靠table类中的相应方法来创建。

所以你创建的每一个Record都天生的属于一个table。非常合理,完美的工程性体现,因为目前市面上的数据库引擎里还真的没有非常实用的脱离table创建record的方案。

那么,这个.net是如何做到的呢?方法不复杂,关键字就是虚基类(.net中叫接口interface) ,派生,内部类(Nest Class)

现在我们在c++中来重现一下c#中的这个设计吧。

首先就是虚基类

class SqlRecord
{
  virtual void S
etName(string Name) = 0;
  virtual string GetName() = 0;
};

虚基类是不能直接new出来的,所以如果任何人想要在代码里new个指针或者定义个SqlRecord对象来,那是编译器这关都过不了的。

那么要怎么实现一个虚基类对象呢,依靠的就是派生。

首先我们创建一个Sqlecord的派生类 MSSQLRecord


class MSSQLRecord : public SqlRecord
{
public:
  //构造函数拷贝构造函数操作符重载,这些重要的代码,作者统统,都没写,不要在意这些细节... ...
  void SetName(string Name){m_Name = Name;}
  string GetName(){return m_Name;}
private:
  string m_Name;

};

然后让我们先来来简单弄个派生就好了

SqlRecord *p;  //空指针啊空指针
//t = new SqlRecord;  //都说了不要new,编译都不行的
MSSQLRecord * p_Dev = new MSSQLRecord;
p = p_Dev;

p.SetName("My Name");
cout << p.GetName() <<endl;


看,一个不能直接new却可以通过派生的数据record类就设计完成了,等灯等灯!

但是,滚粗啊作者,我们还是可以直接new一个MSSQLRecord对象来啊。

好吧,所以接下来当然就是要依靠nest内部类来实现第二件事情了:封装MSSQLRecord对象!!

来看看,这是一个MSSQLTable类

class MSSQLTable
{
public:
  void SetTableName(string TableName){m_TableName = TableName}
  void someOtherFunction()
  {
    //do some other means do nothing
  }
private:
  string m_TableName;

}

我们将刚才的MSSQLRecord类添加其内部

class MSSQLTable
{
  class MSSQLRecord
public:
  MSSQLRecord * CreateRecord(string Name)
  {
    MSSQLRecord *p = new MSSQLRecord;
    if (!p)
      throw "some wrong";
    p.SetName(Name);
    Recordlist.insert(p);//add
    return p;
  }

  void SetTableName(string TableName){m_TableName = TableName}
  void someOtherFunction()
  {
    //do some other means do nothing
  }

private:

  class MSSQLRecord : public SqlRecord
  {
  public:
    //构造函数拷贝构造函数操作符重载,这些重要的代码,作者统统,都没写,不要在意这些细节... ...
    void SetName(string Name){m_Name = Name;}
    string GetName(){return m_Name;}
  private:
    string m_Name;
  };

  list<MSSQLRecord> Recordlist;

  string m_TableName;

};

大家都知道(好吧,其实我觉得你都看到这了说明你不知道),private标记的内部类比虚基类还麻烦,这次你连弄个指针都不行了。

所以你只好用public的那个方法CreateReocrd(string Name)方法结合虚基类的指针。


main()
{
  MSSQLTable t;
  SqlRecord *p;
  p = t.CreateRecord("myrecord");
  cout << p.GetName() << endl;

}

一切都明白了吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值