【问题标题】:Porting C++ struct to Delphi将 C++ 结构移植到 Delphi
【发布时间】:2011-02-08 15:30:42
【问题描述】:

首先,让我展示一下结构:

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代码?

感谢您的帮助。

【问题讨论】:

  • 我建议你可能需要阅读一些关于 C++ 的入门书籍...
  • 您是否想通过 Delphi 模块和 C++ 模块之间的边界传递这些结构之一?

标签: c++ delphi struct


【解决方案1】:

结构内的 HPOLY 重复是该类型的 构造函数 的定义。在 Delphi 中,复制构造函数(C++ 中的第三个,它基于相同类型的另一个实例构造该类型的实例)在 Delphi 中是不必要的。两个参数的构造函数允许您为两个字段指定初始值。默认的零参数构造函数将字段的值设置为 -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++ 以来已经有一段时间了,但是 IIRC 复制构造函数和赋值运算符在原始 C++ 代码中都是多余的。编译器生成的默认值就足够了。
【解决方案2】:

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 代码确实是 :)
  • @Smasher,Delphi 代码看起来更具可读性的部分原因是它的功能不如原始 C++ 代码。 Delphi 中只有复制构造函数和赋值运算符是隐含的。 Vz0的代码省略了默认构造函数,这在Delphi中甚至是不允许的,也省略了二元构造函数和比较运算符。
  • @Smasher 我敢肯定,精通 C++ 的人会有不同的看法。你看得懂的东西,别人可能看不懂。
  • 你当然是对的。我对此并不太认真(如笑脸所示)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多