Theolizer
Version.1.2.0
serializer for C++ / Do you want to update your classes easily ?
7a.class_variation.h
[詳解]
1
//############################################################################
2
/*!
3
@brief ドキュメント・ファイル-使用方法(個別)
4
@ingroup Documents
5
@file 7a.class_variation.h
6
@author Yoshinori Tahara
7
@date 2016/12/02 Created
8
*/
9
/*
10
© 2016 Theoride Technology (http://theolizer.com/) All Rights Reserved.
11
"Theolizer" is a registered trademark of Theoride Technology.
12
13
"Theolizer" License
14
In the case where you are in possession of a valid “Theolizer” License,
15
you may use this file in accordance with the terms and conditions of
16
the use license determined by Theoride Technology.
17
18
General Public License Version 3 ("GPLv3")
19
You may use this file in accordance with the terms and conditions of
20
GPLv3 published by Free Software Foundation.
21
Please confirm the contents of GPLv3 at https://www.gnu.org/licenses/gpl.txt .
22
A copy of GPLv3 is also saved in a LICENSE.TXT file.
23
24
商用ライセンス
25
あなたが有効なTheolizer商用ライセンスを保持している場合、
26
セオライド テクノロジーの定める使用許諾書の条件に従って、
27
このファイルを取り扱うことができます。
28
29
General Public License Version 3(以下GPLv3)
30
Free Software Foundationが公表するGPLv3の使用条件に従って、
31
あなたはこのファイルを取り扱うことができます。
32
GPLv3の内容を https://www.gnu.org/licenses/gpl.txt にて確認して下さい。
33
またGPLv3のコピーをLICENSE.TXTファイルにおいてます。
34
*/
35
//############################################################################
36
37
/*!
38
@page ClassVariation クラスのバリエーション
39
ここでは、クラス(classとstruct)をシリアライズする時の様々なバリエーションについて説明します。
40
41
<br>
42
//############################################################################
43
@section FullAutoClass 1.非侵入型完全自動クラス
44
//############################################################################
45
46
これはシリアライズするためにクラス定義への前準備が不要な使い方です。<br>
47
使用している他のライブラリの「構造体」をシリアライズしたい時、および、プロトタイピングやデバッグ中に一時的にシリアライズしたい時に用います。<br>
48
49
使い方は簡単で、シリアライズしたい構造体のインスタンスをいきなりTHEOLIZER_PROCESS()マクロに与えるだけです。
50
51
<b>定義例</b> (source/reference_and_test/basic/test_class_variation.h)<br>
52
非侵入型完全自動クラスの定義例です。
53
54
@dontinclude basic/test_class_variation.h
55
@skip FullAutoTutorial
56
@until };
57
58
<b>保存処理例</b> (source/reference_and_test/basic/test_class_variation.cpp の <b>tutoriseClassVariation()</b> 関数)<br>
59
上記のFullAutoTutorialを保存するコード例です。
60
61
@dontinclude basic/test_class_variation.cpp
62
@skip void tutoriseClassVariation()
63
@skip "tutoriseClassVariation() start"
64
@skip {
65
@until THEOLIZER_PROCESS
66
@skip }
67
@until }
68
69
<b>保存結果</b> (`<ビルド・フォルダ>/Testing/tutorise_class_variation.json`)<br>
70
上記で保存されたシリアライズ・データの該当部分です。<br>
71
このファイルは、<b>zy2_long_test.sh</b>や<b>zz2_long_test.bat</b> にて自動生成されます。(「@ref HowToBuildLibrary13 」参照。)本節のビルド・フォルダ配下のファイルは全て同じです。<br>
72
privateメンバ以外のメンバが保存されています。
73
@code
74
{
75
"mFullAutoProtected":456,
76
"mFullAutoPublic":789
77
}
78
@endcode
79
80
<b>回復処理例</b> (source/reference_and_test/basic/test_class_variation.cpp の <b>tutoriseClassVariation()</b> 関数)<br>
81
上記のFullAutoTutorialを回復して値をチェックするコード例です。
82
83
@skip {
84
@until THEOLIZER_EQUAL
85
@skip }
86
@until }
87
88
Theolizerドライバがシリアライズされていることを検出し、自動的に必要なメンバ・リストを生成して、シリアライズ可能な状態にします。<br>
89
privateメンバをシリアライズするためには、対象構造体の内部にシリアライズ関数を設ける必要が有ります。
90
それを自動的に行うと問題が多発してしまいます。(例えば「他のライブラリ」のソースを変更してしまう。)<br>
91
それは行うべきではありませんので完全自動クラスを「非侵入型」として実装しました。従って、privateメンバをシリアライズすることはできません。<br>
92
なお、対象クラスを派生して派生先クラスでシリアライズ関数を実装しているため、protectedメンバはシリアライズします。
93
94
各メンバに対して保存の有無、および、保存先の指定が可能です。「@ref Destinations 」を参照下さい。<br>
95
<br>
96
//############################################################################
97
@section HalfAutoClass 2.侵入型半自動クラス
98
//############################################################################
99
100
これはシリアライズするためにクラス定義への前準備が必要ですが、クラス定義のバージョン管理が可能になる使い方です。(バージョン管理については「@ref ChangingClass 」を参照下さい。)<br>
101
102
クラス定義のバージョン管理が不要な間は原則として使う必要はありません。<br>
103
例外は下記です。
104
- privateメンバもシリアライズしたい時
105
- メンバ変数を「順序対応」にしたい時
106
107
「@ref Basic121 」で説明したように、シリアライズ・データとプログラム間でメンバ変数を対応する方法として2種類サポートしています。
108
109
<b>名前対応の定義例</b> (source/reference_and_test/basic/test_class_variation.h)<br>
110
侵入型半自動クラスを「名前対応」で定義する時はTHEOLIZER_INTRUSIVE()マクロを使います。
111
112
@dontinclude basic/test_class_variation.h
113
@skip HalfAutoNameTutorial
114
@until };
115
116
<b>順序対応の定義例</b> (source/reference_and_test/basic/test_class_variation.h)<br>
117
侵入型半自動クラスを「名前対応」で定義する時はTHEOLIZER_INTRUSIVE_ORDER()マクロを使います。
118
119
@skip HalfAutoOrderTutorial
120
@until };
121
122
THEOLIZER_INTRUSIVE()とTHEOLIZER_INTRUSIVE_ORDER()は、最後に<b>private:</b> で終わっています。ですので、クラス定義の最後に置くことをお勧めします。
123
124
これらのマクロは次のように使います。
125
126
- <b>THEOLIZER_INTRUSIVE(dAnno, dClass, dLastVersionNo);</b>
127
- <b>THEOLIZER_INTRUSIVE_ORDER(dAnno, dClass, dLastVersionNo);</b>
128
129
それぞれのパラメータは以下の通りです。
130
131
- <b>dAnno</b><br>
132
メンバ保存の指定方法のオプションです。詳しくは「@ref Destinations 」を参照下さい。<br>
133
- CS : デフォルトで保存します。(通常はこちらを指定して下さい。)<br>
134
- CN : デフォルトは保存しません。(保存するメンバを指定します)<br>
135
- <b>dClass</b><br>
136
自クラス名を指定します。C++はメンバ関数の外クラス定義内で自クラスにアクセスできないため、指定が必要なのです。クラス名の外側に必ず()を付けて下さい。<br>
137
- <b>dLastVersionNo</b><br>
138
最新版のローカル・バージョン番号を指定します。最初は1を指定して下さい。<br>
139
「@ref ChangingClass 」で使い方を説明します。<br>
140
<br>
141
142
<b>保存処理/回復処理</b>は非侵入型完全自動と同じですので、省略します。
143
144
<b>保存結果</b> (`<ビルド・フォルダ>/Testing/tutorise_class_variation.json`)<br>
145
保存されたシリアライズ・データの該当部分です。<br>
146
privateメンバも含めて保存されています。
147
@code
148
{
149
"mHalfAutoNamePrivate":-123,
150
"mHalfAutoNameProtected":-456,
151
"mHalfAutoNamePublic":-789
152
}
153
@endcode
154
155
<br>
156
//############################################################################
157
@section ManualClass 3.非侵入型手動クラス
158
//############################################################################
159
160
これは自動でシリアライズすることが困難なクラスに対応するために設けました。<br>
161
例えば、std::vector<>を自動的に適切なシリアライズをすることは現実的ではありません。そのような場合に保存/回復処理を手動で記述するための仕組みです。<br>
162
使い方が難しいため、どうしても必要な時だけお使い下さい。(クラス・テンプレートにも対応しているのですが、使い方の難易度が高いこと、および、十分なテストを行うには時間が掛かりそうですので、現時点ではクラス・テンプレート対応は非公開と致します。)
163
164
下記の手順で保存/回復処理を記述することを推奨します。<br>
165
166
1. @link DefineManualClass プロジェクトをビルド・エラーがでない状態にして下さい。@endlink<br>
167
シリアライズ対象クラスの定義を行って下さい。そして、ビルド・エラーをなくすことをお勧めします。<br>
168
<br>
169
170
2. @link SpecifyManualClass 対象とするクラスをTHEOLIZER_NON_INTRUSIVE_ORDER()マクロで指定します。@endlink<br>
171
<br>
172
173
3. @link TemplateManualClass 一度ビルドします。この時、未定義エラーが出ます。@endlink<br>
174
TheolizerNonIntrusive<対象クラス名>::%TheolizerUserDefine を含むエラーになります。<br>
175
この部分はテンプレートを使っていることもあり、あまり適切なエラー・メッセージになりません。たいへん申し訳ないですが、注意深くご使用下さい。<br>
176
<br>
177
178
4. @link CopyManualClass 自動生成されたソース内にある未定義エラーのクラス定義雛形をコピーします。@endlink<br>
179
これは保存/回復処理の記述先関数の枠組み定義です。<br>
180
これをTHEOLIZER_NON_INTRUSIVE_ORDER()マクロの直後へコピーして下さい。<br>
181
<br>
182
183
5. @link WriteManualClass 上記のクラス内に保存/回復処理を記述して下さい。@endlink<br>
184
<br>
185
186
6. @link SaveLoadManualClass 後は通常通りTHEOLIZER_PROCESS()シリーズ・マクロでシリアライズ処理します。@endlink<br>
187
188
@subsection DefineManualClass 3-1.非侵入型手動クラスの定義例
189
サンプル・ソースは source/reference_and_test/basic/test_class_variation.h です。<br>
190
非侵入型手動クラスの定義例です。
191
192
@skip ManualTutorial
193
@until };
194
195
@subsection SpecifyManualClass 3-2.非侵入型手動クラスのシリアライズ指定
196
サンプルですのでクラス定義に続けてシリアライズ指定していますが、実際にはシリアライズ指定はクラス定義より後であれば離れていてもよいです。
197
198
@skip ManualTutorial
199
@until THEOLIZER_NON_INTRUSIVE_ORDER
200
201
THEOLIZER_NON_INTRUSIVE_ORDER()マクロは次のように使います。
202
203
- <b>THEOLIZER_NON_INTRUSIVE_ORDER(dClass, dLastVersionNo);</b><br>
204
手動型は順序対応のみです。<br>
205
206
パラメータは以下の通りです。
207
208
- <b>dClass</b><br>
209
対象クラス名を指定します。クラス名の外側に必ず()を付けて下さい。<br>
210
- <b>dLastVersionNo</b><br>
211
最新版のバージョン番号は指定します。最初は1を指定して下さい。<br>
212
「@ref ChangingClass 」で使い方を説明します。<br>
213
<br>
214
215
@subsection TemplateManualClass 3-3.自動生成される保存/回復処理用関数の雛形例
216
サンプルは `<ビルド・フォルダ>/reference_and_test/basic/test_class_variation.cpp.theolizer.hpp` に生成されます。<br>
217
ManualTutorialクラスに対する部分は下記です。<br>
218
219
@code
220
#ifdef THEOLIZER_WRITE_CODE // ###### ManualTutorial ######
221
222
#if false // Sample of save/load function.
223
template<class tBaseSerializer, class tTheolizerVersion>
224
struct TheolizerNonIntrusive<ManualTutorial>::TheolizerUserDefine<tBaseSerializer, tTheolizerVersion, 1>
225
{
226
// Save members.
227
static void saveClassManual
228
(
229
tBaseSerializer& iSerializer,
230
typename tTheolizerVersion::TheolizerTarget const*const& iInstance
231
)
232
{
233
234
235
}
236
237
// Load members.
238
static void loadClassManual
239
(
240
tBaseSerializer& iSerializer,
241
typename tTheolizerVersion::TheolizerTarget*& oInstance
242
)
243
{
244
if (!oInstance) oInstance=new typename tTheolizerVersion::TheolizerTarget();
245
246
247
}
248
};
249
#endif // Sample of save/load function.
250
251
#define THEOLIZER_GENERATED_LAST_VERSION_NO THEOLIZER_INTERNAL_DEFINE(kLastVersionNo,1)
252
#define THEOLIZER_GENERATED_CLASS_TYPE ManualTutorial
253
254
// ---<<< Version.1 >>>---
255
256
#define THEOLIZER_GENERATED_VERSION_NO THEOLIZER_INTERNAL_DEFINE(kVersionNo,1)
257
#define THEOLIZER_GENERATED_CLASS_NAME()\
258
THEOLIZER_INTERNAL_CLASS_NAME((u8"ManualTutorial"))
259
#include <theolizer/internal/version_manual.inc>
260
#undef THEOLIZER_GENERATED_VERSION_NO
261
262
#endif//THEOLIZER_WRITE_CODE // ###### ManualTutorial ######
263
@endcode
264
265
@subsection CopyManualClass 3-4.クラス定義雛形のコピー
266
上記雛形の <b>#%if false // Sample of save/load function.</b> の次の行から、 <b>#%endif // Sample of save/load function.</b> の前の行までを、THEOLIZER_NON_INTRUSIVE_ORDER((ManualTutorial), 1);の直後へコピーします。
267
268
@subsection WriteManualClass 3-5.保存/回復処理関数の記述
269
雛形をコピーしたsave/load関数にトップ・レベルと同じく下記マクロ群を用いて、必要な情報を保存/回復します。<br>
270
271
- THEOLIZER_PROCESS
272
- THEOLIZER_PROCESS_POINTEE
273
- THEOLIZER_PROCESS_OWNER
274
275
また、非侵入型手動専用のシリアライズ・マクロがあります。
276
277
- THEOLIZER_PROCESS_BASE
278
279
<b>THEOLIZER_PROCESS_BASE(dSerializer, dBase, dInstance)</b>
280
- dSerializer : シリアライザのインスタンスを指定します。<br>
281
- dBase : 保存/回復する基底クラスをクラス名で指定します。<br>
282
- dInstance : 保存/回復するインスタンスを指定します。<br>
283
284
保存/回復処理のサンプルです。
285
286
@dontinclude basic/test_class_variation.h
287
@skip ManualTutorial
288
@skip <<<
289
@until };
290
291
<b>tTheolizerVersion::TheolizerTarget</b> は、指定した対象クラス型へ展開されます。<br>
292
この例ではManualTutorialです。constや参照がついていて分かりにくいですが、意味的には下記となります。
293
294
- saveClassManual() 関数の<b>iInstance</b> : ManualTutorialへのポインタ
295
- loadClassManual() 関数の<b>oInstance</b> : ManualTutorialへのポインタへの参照
296
297
oInstanceにnullptrが設定されていた場合は、領域を獲得して下さい。<br>
298
その際、一部の回復処理を先に行い、その値を使ってコンストラクタしてポインタを返却するため、ポインタへの参照にしています。
299
300
@subsection SaveLoadManualClass 3-6.保存/回復処理例
301
302
<b>保存処理/回復処理</b>は非侵入型完全自動と同じですので、省略します。
303
304
<b>保存結果</b> (`<ビルド・フォルダ>/Testing/tutorise_class_variation.json`)<br>
305
保存されたシリアライズ・データの該当部分です。<br>
306
順序対応なのでメンバ変数名は出力されません。mManualPublicに100を設定して保存していますので、100のみが出力されます。
307
@code
308
[
309
100
310
]
311
@endcode
312
313
<br>
314
//############################################################################
315
@section DerivedIncluded 4.それらを派生したり包含したりしたクラス
316
//############################################################################
317
各種クラスの派生、および、包含(メンバ変数として他のクラス型を用いる)は、通常通りです。
318
319
<b>各種クラスを派生/包含した例</b> (source/reference_and_test/basic/test_class_variation.h)<br>
320
FullAutoTutorialをpublic継承、HalfAutoNameTutorialをprivate継承、HalfAutoOrderTutorialをprivateメンバ、ManualTutorialをpublicメンバとした非侵入型完全自動クラスです。<br>
321
protectedを定義していませんが、protected継承、protectedメンバの両方とも使えます。
322
323
@skip DerivedClass
324
@until };
325
326
<b>保存処理例</b> (source/reference_and_test/basic/test_class_variation.cpp の <b>tutoriseClassVariation()</b> 関数)<br>
327
上記のDerivedClassを保存するコード例です。
328
329
@dontinclude basic/test_class_variation.cpp
330
@skip void tutoriseClassVariation()
331
@skip "tutoriseClassVariation() start"
332
@skip {
333
@until JsonOSerializer
334
@skip 派生/包含クラス
335
@until }
336
337
<b>保存結果</b> (`<ビルド・フォルダ>/Testing/tutorise_class_variation.json`)<br>
338
上記で保存されたシリアライズ・データの該当部分です。<br>
339
名前対応ですので、基底クラスの定義順序変更に備え基底クラスは()付きでクラス名で保存しています。<br>
340
非侵入型ですのでprivate継承したクラス、およひ、privateメンバは保存されません。
341
342
@code
343
{
344
"(FullAutoTutorial)":{
345
"mFullAutoProtected":201,
346
"mFullAutoPublic":202
347
},
348
"mManualTutorial":[
349
207
350
]
351
}
352
@endcode
353
354
<b>回復処理例</b> (source/reference_and_test/basic/test_class_variation.cpp の <b>tutoriseClassVariation()</b> 関数)<br>
355
上記のFullAutoTutorialを回復して値をチェックするコード例です。
356
357
@skip {
358
@until JsonISerializer
359
@skip 派生/包含クラス
360
@until }
361
362
private継承したクラス、およひ、privateメンバは保存されないため、デフォルト・コンストラクタで生成された値(0)のまま変化しませんので、0と一致することを確認しています。
363
364
<br>
365
//############################################################################
366
@section TestClassVariation 5.網羅的な使用例(自動テスト)の説明
367
//############################################################################
368
369
網羅的な自動テスト用のクラスは<b>source/reference_and_test/basic/test_class_variation.h</b> ファイルの「単独テスト」以降で定義しています。<br>
370
また、テスト処理は<b>source/reference_and_test/basic/test_class_variation.cpp</b> ファイルで定義しており、saveClassVariation()関数で保存処理、loadClassVariation()関数で回復処理と値の検証を行っています。
371
372
@subsection SingleTest 5-1.単独テスト
373
単独テストの先頭で<b>DEFINE_MEMBERS()マクロ</b>を定義しています。<br>
374
375
これは、全てのプリミティブ型、幾つかの基本的なenum型とクラスについて、単独、および、配列を定義するためのマクロです。このマクロを展開する直前でDEFINE()とARRAY()マクロを定義することで各々について、メンバ変数の定義、初期化、保存、回復、値チェックするコードを生成しています。
376
377
@dontinclude basic/test_class_variation.h
378
@skip DEFINE_MEMBERS
379
@until ARRAY(ClassBasicTest
380
@until ClassBasicTest()
381
382
単独テストの内容は、以下の通りです。
383
384
1. 「@ref BasicProcess 」の網羅テストと同じプリミティブとenum型、クラス、配列のセットの定義<br>
385
多数用いるのでDEFINE_MEMBERS()マクロで定義しています。<br>
386
<br>
387
388
2. 非侵入型完全自動クラス(FullAuto)<br>
389
DEFINE_MEMBERS()マクロのメンバについて、private, protected, publicのそれぞれに定義しています。<br>
390
ArrayOnly0(非侵入型完全自動クラス)クラスの配列メンバをpublicとして定義しています。<br>
391
privateメンバ以外は保存/回復でき、privateメンバは初期値が維持されることを検証しています。<br>
392
<br>
393
394
3. 侵入型半自動-名前対応クラス(HalfAutoName)<br>
395
DEFINE_MEMBERS()マクロのメンバについて、private, protected, publicのそれぞれに定義しています。<br>
396
ArrayOnly1(非侵入型完全自動クラス)クラスの配列メンバをpublicとして定義しています。<br>
397
全てのメンバが保存/回復できることを検証しています。<br>
398
<br>
399
400
4. 侵入型半自動-順序対応クラス(HalfAutoorder)<br>
401
DEFINE_MEMBERS()マクロのメンバについて、private, protected, publicのそれぞれに定義しています。<br>
402
ArrayOnly2(非侵入型完全自動クラス)クラスの配列メンバをpublicとして定義しています。<br>
403
全てのメンバが保存/回復できることを検証しています。<br>
404
<br>
405
406
5. 非侵入型手動クラス(Manual)<br>
407
DEFINE_MEMBERS()マクロのメンバについて、public定義しています。<br>
408
ArrayOnly3(非侵入型完全自動クラス)クラスの配列メンバをpublicとして定義しています。<br>
409
全てのメンバの保存/回復処理を実装しています。<br>
410
全てのメンバが保存/回復できることを検証しています。<br>
411
(非侵入型手動クラスで、private/protectedメンバをシリアライズするコードを記述するとコンパイルできないため、これらのメンバの実装とシリアライズ・テストは行なっていません。)
412
413
<br>
414
415
<b>ArrayOnly</b>について<br>
416
他のクラスメンバに配列としてのみ使用される非侵入型完全自動クラスのソース自動生成に不具合が発生したため、その再発防止用として実装しています。<br>
417
418
@subsection DoubleTest 5-2.二重組み合わせテスト
419
420
@subsubsection DoubleTestHelper 5-2-1.二重組み合わせテスト用のヘルパー・クラス
421
非侵入型完全自動(BaseFullAuto)、侵入型半自動(BaseHalfAuto)、非侵入型手動(BaseManual)のクラス・テンプレートを定義しています。<br>
422
これらは全てテンプレート・パラメータとしてint型の非型パラメータを1つ持ち、メンバ変数の初期値を決めてます。<br>
423
424
これらのBaseXxxクラス群を派生したクラスは更に別のクラスへ派生されます。その際、同じ基底クラスを複数の派生クラスを経由して1つの派生クラスに継承されることは許されないため、この非型パラメータを用いて別クラスにしています。<br>
425
例えば、下記のように定義すると、BaseFullAutoがDrivedFullAutoとDrivedHalfAutoを経由してTripledFullAutoへ継承されるためエラーになります。それを防ぐためにBaseFullAutoをクラス・テンプレートとし、DrivedFullAutoとDrivedHalfAutoへの継承は別実体としています。
426
@code
427
BaseFullAuto { };
428
DrivedFullAuto : public BaseFullAuto { };
429
DrivedHalfAuto : public BaseFullAuto { };
430
TripledFullAuto : public DrivedFullAuto, public DrivedHalfAuto { };
431
@endcode
432
433
BaseFullAutoは侵入型半自動クラスPrivateInheritanceをprivate継承しています。<br>
434
BaseManualは侵入型半自動クラスProtectedInheritanceをprotected継承しています。<br>
435
侵入型を非侵入型へprivate/protected継承するとMinGWでビルド・エラーになる不具合が発生したため、その再発防止用です。<br>
436
437
侵入型内部で定義しているstatic変数(kIsTheolizer)の有無で侵入型であることを判定していたのですが、private継承しているため非侵入型クラスにkIsTheolizerがprivateで存在していることになります。<br>
438
kIsTheolizerはアクセスできないのでSFINAEにより合致しないことを期待したのですが、「privateなのでアクセスできないエラー」となってしまいました。他の手段で判定し回避しました。
439
440
@subsubsection DoubleTestImpl 5-2-2.二重組み合わせテスト本体
441
内容は、以下の通りです。
442
443
1. 非侵入型完全自動クラス(DerivedFullAuto)<br>
444
BaseFullAuto, BaseHalfAuto, BaseManualのそれぞれを、private, protected, public継承しています。合計9個のクラスを継承しています。<br>
445
BaseFullAuto, BaseHalfAuto, BaseManualのそれぞれを、private, protected, publicメンバ変数として定義しています。<br>
446
private継承したクラス、および、DerivedFullAutoのprivateメンバ変数は全て初期値が維持されること、それら以外のクラスについてはBaseFullAutoのprivateメンバ以外は全て保存/回復されること、BaseFullAutoのprivateメンバは初期値が維持されることを検証しています。<br>
447
<br>
448
449
2. 侵入型半自動クラス(DerivedHalfAuto)<br>
450
BaseFullAuto, BaseHalfAuto, BaseManualのそれぞれを、private, protected, public継承しています。合計9個のクラスを継承しています。<br>
451
BaseFullAuto, BaseHalfAuto, BaseManualのそれぞれを、private, protected, publicメンバ変数として定義しています。<br>
452
全ての継承したクラス、および、DerivedHalfAutoのメンバ変数において、BaseFullAuto型のprivateメンバは全て初期値が維持されること、それら以外については全て保存/回復されることを検証しています。<br>
453
<br>
454
455
3. 非侵入型手動クラス(DerivedManual)<br>
456
BaseFullAuto, BaseHalfAuto, BaseManualのそれぞれを、public継承しています。合計3個のクラスを継承しています。<br>
457
BaseFullAuto, BaseHalfAuto, BaseManualのそれぞれを、publicメンバ変数として定義しています。<br>
458
全ての基底クラスと全てのメンバ変数について保存/回復処理関数を実装しています。
459
BaseFullAutoのprivateメンバは全て初期値が維持されること、それら以外については全て保存/回復されることを検証しています。<br>
460
<br>
461
462
@subsection TripledTest 5-3.三重組み合わせテスト
463
DerivedFullAuto, DerivedHalfAuto, DerivedManualを更に組み合わせて以下の自動テストを行います。
464
465
466
1. 非侵入型完全自動クラス(TripledFullAuto)<br>
467
DrivedFullAuto, DrivedHalfAuto, DrivedManualのそれぞれを、public継承しています。合計3個のクラスを継承しています。<br>
468
DrivedFullAuto, DrivedHalfAuto, DrivedManualのそれぞれを、private, protected, publicメンバ変数として定義しています。<br>
469
TripledFullAutoクラスのprivateメンバ変数は全て初期値が維持されること、それら以外について、非侵入型完全自動クラスのprivateメンバは初期値が維持されること、それら以外については全て保存/回復されることを検証しています。<br>
470
<br>
471
472
2. 侵入型半自動クラス(TripledHalfAuto)<br>
473
DrivedFullAuto, DrivedHalfAuto, DrivedManualのそれぞれを、public継承しています。合計3個のクラスを継承しています。<br>
474
DrivedFullAuto, DrivedHalfAuto, DrivedManualのそれぞれを、private, protected, publicメンバ変数として定義しています。<br>
475
非侵入型完全自動クラスのprivateメンバは全て初期値が維持されること、それら以外については全て保存/回復されることを検証しています。<br>
476
<br>
477
478
3. 非侵入型手動クラス(TripledManual)<br>
479
DrivedFullAuto, DrivedHalfAuto, DrivedManualのそれぞれを、public継承しています。合計3個のクラスを継承しています。<br>
480
DrivedFullAuto, DrivedHalfAuto, DrivedManualのそれぞれを、publicメンバ変数として定義しています。<br>
481
全ての基底クラスと全てのメンバ変数について保存/回復処理関数を実装しています。<br>
482
非侵入型完全自動クラスのprivateメンバは全て初期値が維持されること、それら以外については全て保存/回復されることを検証しています。<br>
483
<br>
484
485
*/
Theolizer
source
document
ja
7a.class_variation.h
© 2016
Theoride Technology
All Rights Reserved. "Theolizer" is a registered trademark of Theoride Technology.
構築:
1.8.12