概要
Delphiのレコード型をC++Builderで使用したとき、レコードをクラスメソッドから生成すると引数の値が設定されない。
実行環境
- C++Builder XE3
-
ターゲットプラットフォーム
32ビット Windows※64ビット Windowsでは問題ありませんでした。
再現手順
-
C++Builder XE3のメニューから「ファイル」→「新規作成」→「その他」→「C++Builder プロジェクト」→「コンソール アプリケーション」を選択する。
-
プロジェクトに次の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.
- 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; }
- プロジェクトビルドして実行すると、下記の結果になる
ターゲットプラットフォームが32ビット Windowsのとき
100 0
ターゲットプラットフォームが64ビット Windowsのとき
100 100
ターゲットプラットフォームが32bit Windowsで、クラスメソッドから生成しているときのみ、引数の値が反映されていない。