C++与Object Pascal相比之不爽处
首先声明,我无意比较两种语言之间的优劣,只是在实际使用过程中表达一点自己的看法,同时,更重要的是我对C++的语法不如Pascal熟,想借此向各位C++高手印证一下,是否下面的“不爽”是由于我自己对C++语法不熟而造成的,如果是,请各位指教正确的用法,不胜感激,谢谢。
第一个问题:关于抽象
先看C++的代码:
#include <iostream.h>
class CTest {
public:
virtual void Teardown(void) = 0; //抽象方法声明
void Foo(void);
virtual ~CTest() { Teardown(); }; //企图规定所有实现CTest的
//对象类在析构时必须调用Teardown()
};
void CTest::Foo(void)
{
cout << "CTest::Foo() called\n";
}
class CTestImp : public CTest {
public:
virtual void Teardown(void); //实现Teardown()
};
void CTestImp::Teardown(void)
{
cout << "CTestImp::Teardown()\n";
}
void cdecl main(void)
{
CTest * test = new CTestImp; //建立对象
test->Foo(); //调用对象的方法,成功
delete test; //销毁对象,运行时刻错,提示
//Pure virtual function called
}
这一点在PASCAL里是不存在的,在PASCAL里的析构函数中,可以方便地调用抽象方法,从而强制规定一个对象在析构的时候,必须执行某种操作。参考DELPHI中的代码:
type
TTest = class
public
destructor Destroy; override; //析构方法
procedure Teardown; virtual; abstract; //抽象方法
procedure Foo;
end;
TTestImp = class(TTest)
public
procedure Teardown; override; //实现父类的抽象方法
end;
procedure TTestImp.Teardown;
begin
ShowMessage('TTestImp.Teardown called');
end;
destructor TTest.Destroy;
begin
Teardown; //规定所有子类在析构的时候都要调用Teardown方法
inherited;
end;
procedure TTest.Foo;
begin
ShowMessage('TTest.Foo called');
end;
// 下面是测试代码,运行成功,达到目的
procedure TForm1.FormCreate(Sender: TObject);
var
test: TTest;
begin
test := TTestImp.Create;
try
test.Foo;
finally
test.Free;
end;
end;
第二个问题:关于try ... finally块
DELPHI中的try ... finally非常出色,而C++中就有遗憾。首先,标准C++里只有try和catch,而没有finally,非常不方便,当我们想无论如何都要执行某段代码时,用标准C++实现起来很麻烦,比方说我们想在申请内存后执行一些操作,而无论这些操作是否出错,都要执行释放内存的代码。或者创建一个对象,执行一些操作,最后无论如何都销毁这个对象。PASCAL中用try...finally非常方便,参见上面的test.Free那段代码。
而在Win32平台下的C++,由于Windows本身提供了SEH(结构化异常处理)机制,所以VC++中定义了__try、__catch和__finally,但是首先它们不是标准C++,其次它们只依赖于特定平台,最后,下面的代码在编译时刻无法通过:
class CTest {
public:
virtual void Foo(void) = 0;
};
class CTestImp : public CTest {
public:
virtual void Foo(void);
};
void CTestImp::Foo(void)
{
MessageBox(0, "00000", NULL, MB_OK);
}
void test(void)
{
CTest * test = new CTestImp();
__try {
test->Foo();
} __finally {
delete test;
}
}
编译错误信息:
error C2712: Cannot use __try in functions that require object unwinding
------------上面两点是最近我用C++重写以前程序时遇到的问题,请大家指正。