Delphiのレコード型をC++Builderで使用したとき、レコードをクラスメソッドから生成すると引数の値が設定されない?

概要

Delphiのレコード型をC++Builderで使用したとき、レコードをクラスメソッドから生成すると引数の値が設定されない。

実行環境

  • C++Builder XE3

  • ターゲットプラットフォーム
    32ビット Windows

    ※64ビット Windowsでは問題ありませんでした。

再現手順

  1. C++Builder XE3のメニューから「ファイル」→「新規作成」→「その他」→「C++Builder プロジェクト」→「コンソール アプリケーション」を選択する。

    01

  2. プロジェクトに次のUnit1.pasを追加する

    unit Unit1;
    
    interface
    
    type
      TRec = record
        I: Integer;
        constructor Create(AI: Integer);
        class function New(AI: Integer): TRec; static;
      end;
    
    implementation
    
    { TRec }
    
    constructor TRec.Create(AI: Integer);
    begin
      Self.I := AI;
    end;
    
    class function TRec.New(AI: Integer): TRec;
    begin
      Result := TRec.Create(AI);
    end;
    
    end.
    
  3. File1.cppに次のコードを追加する
    #include <vcl.h>
    #include <windows.h>
    
    #pragma hdrstop
    #pragma argsused
    
    #include <tchar.h>
    #include <stdio.h>
    #include <iostream> //追加
    #include "Unit1.hpp" //追加
    
    int _tmain(int argc, _TCHAR* argv[])
    {
      //追加
      {
        TRec r = TRec(100);
        std::cout << r.I << std::endl;
      }
      {
        TRec r = TRec::New(100);
        std::cout << r.I << std::endl;
      }
        return 0;
    }
    
  4. プロジェクトビルドして実行すると、下記の結果になる

    ターゲットプラットフォームが32ビット Windowsのとき

    100
    0
    

    ターゲットプラットフォームが64ビット Windowsのとき

    100
    100
    

    ターゲットプラットフォームが32bit Windowsで、クラスメソッドから生成しているときのみ、引数の値が反映されていない。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください