将C++结构体移植到Delphi

4

首先,让我向您展示结构体:

struct HPOLY
{
   HPOLY() : m_nWorldIndex(0xFFFFFFFF), m_nPolyIndex(0xFFFFFFFF) {}
   HPOLY(__int32 nWorldIndex, __int32 nPolyIndex) : m_nWorldIndex(nWorldIndex), m_nPolyIndex(nPolyIndex) {}
   HPOLY(const HPOLY& hPoly) : m_nWorldIndex(hPoly.m_nWorldIndex), m_nPolyIndex(hPoly.m_nPolyIndex) {}

   HPOLY &operator=(const HPOLY &hOther)
   {
      m_nWorldIndex = hOther.m_nWorldIndex;
      m_nPolyIndex = hOther.m_nPolyIndex;
      return *this;
   }

   bool operator==(const HPOLY &hOther) const
   {
      return (m_nWorldIndex == hOther.m_nWorldIndex) && (m_nPolyIndex == hOther.m_nPolyIndex);
   }
   bool operator!=(const HPOLY &hOther) const
   {
      return (m_nWorldIndex != hOther.m_nWorldIndex) || (m_nPolyIndex != hOther.m_nPolyIndex);
   }
   __int32 m_nPolyIndex, m_nWorldIndex;
}; 

有些事情我不太明白。

结构体中 HPOLY 的重复是什么意思?如何将结构体转换为 Delphi 代码?

感谢您的帮助。


4
我建议您可能需要阅读一些C ++入门书籍... - Oliver Charlesworth
你想要在 Delphi 模块和 C++ 模块之间传递这些结构体中的一个吗? - David Heffernan
2个回答

8
结构体中的HPOLY重复定义了该类型的构造函数。在Delphi中,不需要复制构造函数(C++中的第三个构造函数,它基于同一类型的另一个实例构造一个此类型的实例)。两个参数的构造函数允许您为两个字段指定初始值。默认的零参数构造函数将字段的值设置为-1,但Delphi不允许记录中使用这样的构造函数。
接下来的部分是赋值运算符。Delphi会自动为记录提供赋值运算符。接下来是比较运算符,用于比较该类型的相等和不等。当您在HPoly值上使用=<>运算符时,编译器将调用它们。
type
  HPoly = record
    m_nPolyIndex, m_nWorldIndex: Integer;
    constructor Create(nWorldIndex, nPolyIndex: Integer);
    class operator Equal(const a: HPoly; const b: HPoly): Boolean;
    class operator NotEqual(const a: HPoly; const b: HPoly): Boolean;
  end;

constructor HPoly.Create(nWorldIndex, nPolyIndex: Integer);
begin
  m_nPolyIndex := nPolyIndex;
  m_nWorldIndex := nWorldIndex;
end;

class operator HPoly.Equal(const a, b: HPoly): Boolean;
begin
  Result := (a.m_nPolyIndex = b.m_nPolyIndex)
        and (a.m_nWorldIndex = b.m_nWorldIndex);
end;

class operator HPoly.NotEqual(const a, b: HPoly): Boolean;
begin
  Result := (a.m_nPolyIndex <> b.m_nPolyIndex)
         or (a.m_nWorldIndex <> b.m_nWorldIndex);
end;

我已经很久没有写C++了,但我记得在原始的C++代码中,复制构造函数和赋值运算符都是不必要的。编译器生成的默认函数应该足够使用。 - Uli Gerhardt

4

HPOLY是一个只有两个32位整数字段的结构体: m_nPolyIndexm_nWorldIndex

前三行被称为构造函数: 每当创建一个新的HPOLY实例时执行的代码。然后,在冒号后面写变量名称意味着初始化变量内容。

例如,创建一个空的HPOLY:

HPOLY x;

在x上调用第一个空构造函数。 x.m_nWorldIndex 的值为0xFFFFFFFF,x.m_nPolyIndex 的值为0xFFFFFFFF。

另外两个构造函数手动初始化这两个字段的值:

XPOLY y( 1, 2 );

XPOLY z( y );

y.m_nWorldIndex的值为1,y.m_nPolyIndex 的值为2。

z.m_nWorldIndex的值为y.m_nWorldIndexz.m_nPolyIndex的值为y.m_nPolyIndex

在Delphi中,TPOLY结构可以翻译成以下记录:

TPOLY = Record
  m_nWorldIndex : Integer;
  m_nPolyIndex : Integer;
end; 

+1 是为了表扬你的努力,也证明 Delphi 代码的可读性更高 :) - jpfollenius
6
@Smasher,Delphi代码看起来更易读的部分原因在于它的功能没有原始C++代码多。在Delphi中,只有复制构造函数和赋值运算符是隐式的。Vz0的代码省略了默认构造函数,在Delphi中甚至不允许使用,并且还省略了双参数构造函数和比较运算符。 - Rob Kennedy
1
@Smasher 我相信一个精通C++的人会有不同的看法。对你来说可读的内容可能对其他人来说并不可读。 - David Heffernan
你们当然都是对的。我并不是太认真(如笑脸所示)。 - jpfollenius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接