Портирование структуры C ++ на Delphi - PullRequest
4 голосов
/ 08 февраля 2011

Во-первых, позвольте мне показать вам структуру:

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;
}; 

Есть некоторые вещи, которые я не понимаю.

Что означает повторение ИПОЛИ в структуре? А как расшифровать структуры в код Delphi?

Спасибо за вашу помощь.

Ответы [ 2 ]

8 голосов
/ 08 февраля 2011

Повторение 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;
4 голосов
/ 08 февраля 2011

HPOLY - это структура только с двумя 32-битными целочисленными полями: m_nPolyIndex и m_nWorldIndex.

Первые три строки называются contructors: код, который выполняется при каждом новом экземпляре 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_nWorldIndex, а значение z.m_nPolyIndex равно y.m_nPolyIndex.

В Delphi структуру TPOLY можно преобразовать в следующую запись:

TPOLY = Record
  m_nWorldIndex : Integer;
  m_nPolyIndex : Integer;
end; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...