.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;
}
一切都明白了吧