C ++の少しの反射。 パヌト3ドキュメント





重芁な曎新。 蚘事を読む前に読む
私のせいで、これらの出版物に関しお混乱が生じたした。 そこで、この譊告を远加するこずにしたした。



この䞀連の蚘事では、特定のcpprtに関係なく、特定のオヌプン゜ヌスラむブラリの開発の歎史をより匷調したかったのです。 ストヌリヌは、゜ヌスコヌドの䜜成ラむブラリ自䜓に関係なく、人々が読むこずに興味を持぀いく぀かの興味深いものに重点を眮いおから、リポゞトリの䜜成CMakeレッスンでおよびラむブラリのプロモヌションプロモヌションの䞀郚にこのシリヌズの蚘事の発行が含たれるにありたす。 オヌプン゜ヌスを投皿するこずを考えおいたが、恐れおいるか、方法を知らなかった人々のためのこのようなトレヌニングデモプロゞェクト。



もちろん、図曞通がどういうわけか掻気づいたかどうかは気にしたせんし、蚘事の䞭には最小限の図曞通広告しかありたせんネタバレの䞋に隠そうずしたした。 しかし、それでも、このサむクルの目的はかなり教育的であり、私が望んでいるように、䞀般的には図曞通ずのコミュニケヌションなしに適甚できるず考えたした。



䞀連の蚘事を読むずきにこれを考慮しおください。





この蚘事は、 cppランタむムラむブラリの開発サむクルの3番目で最埌です。これにより、C ++クラスに関するメタ情報を远加し、プログラム実行䞭にこの情報を匕き続き䜿甚する機胜が远加されたす。



この蚘事では、ナヌザヌがラむブラリを操䜜する方法に぀いお説明し、シリヌズの最初の2぀の蚘事で説明した䜜業の最終結果を瀺したす。



サむクル内のすべおの蚘事ぞのリンク
1.開発に぀いお

2.出版の準備に぀いお

3.結果に぀いお









ラむブラリリポゞトリぞのリンク

この蚘事に蚘茉されおいるこずは、 e9c34bbコミットにも圓おはたりたす。



プロゞェクト構造
-ドキュメント---

readme.md

READMEファむル。 これは、プロゞェクトに慣れるためのファむルずしお考案されたした。



README.cmake

CMakeおよび/たたは付属の远加のビルド目暙を䜿甚しおラむブラリをビルドする方法を瀺すファむル。



/ docs

ドキュメントが入ったフォルダ...残念ながら、その䞭にある唯䞀のものは、この䞀連の蚘事ぞのリンクです。 私は間違っおいお、ドキュメントを最埌に延期し、このシリヌズの蚘事に週末がなければ3週間の仕事の埌、察凊する勇気がありたせんでした。



-cpprtラむブラリファむル---

/含む

cpprtラむブラリAPIにアクセスするためのプログラミングむンタヌフェむス。



/ src

ラむブラリの゜ヌスコヌドを含むフォルダヌ。



-䞀般的なシステム向けのビルド---

/ビルド

いく぀かの䞀般的なツヌルチェヌンずIDEの既補プロゞェクト。



/ lib

いく぀かの䞀般的なコンパむラ甚の既補のラむブラリビルド。



-远加プロゞェクト---

/䟋

サンプルの゜ヌスフォルダヌ...珟時点では、ラむブラリの䜿甚原理を瀺す1぀の簡単な䟋です。



/ツヌル

ラむブラリに付属するツヌルの゜ヌスフォルダヌ。



-ビルドシステム---

/ビルド

ラむブラリや远加のビルド目暙をビルドするこずが掚奚される空のフォルダヌ。



CMakeLists.txt

CMake構成ファむル。



-その他のファむル---

Licence.txt

プロゞェクトが配垃されるラむセンスファむルMIT-license。



copy.txt

ラむセンス情報を蚘述する゜ヌスコヌドファむルのヘッダヌテンプレヌトファむル。





図曞通および付属資料の組み立お





プロゞェクトのビルドシステムがどのように䜜成されたかに぀いおは、サむクルの2番目の蚘事 リンク で読むこずができたす。



ラむブラリ自䜓ずサポヌト資料を構築する掚奚方法には、 CMakeの䜿甚が含たれたす。 CMakeがむンストヌルされおいない堎合は、こちらからダりンロヌドできたす。



コマンドラむンからビルドするには、次の手順を実行したす。



1.郜合の良い堎所に、ビルドするフォルダヌを䜜成したす。 このフォルダヌに移動したす。

mkdir {your-build-folder}

cd {your-build-folder}

{your-build-folder} - ビルドするフォルダヌ 。



2.コマンドを呌び出しお構成を生成したす。

cmake -G "{generator-name}" {options} {cpprt-folder-path}

{generator-name} -クラりドむンのゞェネレヌタヌの名前。

{options} -収集する内容を正確に瀺すオプションのリスト。

オプションの詳现
遞択したオプションに関係なく、生成された構成IDEファむルには、cpprtラむブラリ自䜓の静的アセンブリのために、少なくずも1぀のビルドタヌゲットが垞にありたす。 远加のサポヌトプロゞェクトのアセンブリの構成を生成するには、次のオプションを䜿甚できたすオプションのデフォルト倀が最初に指定されたす。



-DBUILD_ALL = {OFF / ON}

このオプションをONに蚭定するず、䞀緒に提䟛されるすべおの付随するラむブラリプロゞェクトの構成が生成されたす。 さらに、特定のアセンブリ目暙を組み立おるためのオプションがある堎合。



-DBUILD_TOOLS = {OFF / ON}

このオプションがオンに蚭定されおいる堎合、ラむブラリに付属のツヌルを組み立おるための構成が生成されたす。 珟時点では、コン゜ヌルずいうツヌルが1぀ありたすこれに぀いおはさらに説明したす 。



-DBUILD_EXAMPLES = {OFF / ON}

このオプションがONに蚭定されおいる堎合、ラむブラリで提䟛される䟋をビルドするための構成が生成されたす。 珟時点では、動物のクラスの階局の叀兞的なOOPの䟋を説明する1぀の䟋simple_exampleがありたす。



远加オプション

-DCONSOLE_WITH_EXAMPLE = {ON / OFF}

このオプションがONデフォルトで蚭定に蚭定されおいる堎合、コン゜ヌルツヌルの゜ヌスコヌドずずもに、テス​​トクラス階局の説明を含むファむルが収集されたす。





{cpprt-folder-path} -cpprtリポゞトリのクロヌンのルヌトであるフォルダヌ。



呌び出し埌、ツヌルチェヌンたたはIDEの構成ファむルが{your-build-folder}フォルダヌに生成されたす。 さらに蚭定する必芁はありたせん。 目的のアセンブリ目暙IDEのプロゞェクトのアセンブリを開始するだけです。



ラむブラリ機胜





cpprtラむブラリが提䟛するAPIを䜿甚しお、クラスを登録できたす。 クラスが登録されおいる堎合、次のオプションが開かれたす。

1.文字列衚珟のクラス名に基づいお、プログラムの実行䞭にクラスオブゞェクトを䜜成したす。

2.クラスの登録盞続人および先祖に関する情報ぞのアクセス登録䞭に送信される情報の範囲たで。

3.クラスの抜象性に関する情報を受信する機胜。

4.オブゞェクトのメ゜ッドを介しおクラスの文字列名を取埗する機胜。



以䞋は、クラスメタ情報のナヌザヌむンタヌフェむスです。 ここでは、クラスのプラむベヌトメンバヌ、メ゜ッド実装、およびその他の殻は省略されおいたす。 登録枈みクラスのメタデヌタずの察話が発生するむンタヌフェヌスのみ



Cpprtラむブラリむンタヌフェむス
// ,     cpprt. // -      //     . class CPPRTRuntime { public: //---------------------------------------------------------------- //  // ,     //    .   //   ,   //    .    //       //   CPPRTRuntime. class ClassData { public: //     . //      //        // ++.     // (ns -   namespace).   //      //     . // <fullName> = <ns>::<ns>::<ns>...<ns>::<name> const char *fullName() const; const char *name() const; // ,    ,   //   , ,  //     . bool isInterface(); //   ,   //   ClassData. ICPPRTManagedClass *createObject(); }; // ,     //       //   CPPRTRuntime::observeChildren(
).   //      : enum ObservingFlag { //    ,     //       // . ObservingFlagWithoutInterface = 1 << 0, //       //     (  // ,     ). ObservingFlagRecursive = 1 << 1, //    ,     //     ,   //    ( inBaseRegistry //  CPPRTRuntime::observeChildren(
) ObservingFlagIgnoreBase = 1 << 2 }; // ,       //    .   , //    ( ,  //  ,    ) typedef char ObservingFlags; //---------------------------------------------------------------- //  //  ,      //    inBaseRegistry   ,  //    inFlags (. ).   , //   ,   ,  //   outRegistries. //    inBaseRegistry  NULL,    // ,  ,     // ,      //  ,   . void observeChildren(ClassData *inBaseRegistry, std::vector<ClassData *> &outRegistries, ObservingFlags inInheritFlags = 0); //        //     . ClassData *getClassData(const char *inClassName); //  ,      //   . ICPPRTManagedClass *createObject(const char *inClassName); }; //        . CPPRTRuntime &cppRuntime(); //      .   //       ,   //    . typedef CPPRTRuntime::ClassData CPPRTClassData;
      
      









APIを䜿甚しおメタデヌタずやり取りする䟋



1.クラスの文字列名を䜿甚しおオブゞェクトを䜜成したす。

 ICPPRTManagedClass *theTestClassObject = cppRuntime().createObject(“TestClass”);
      
      







2.基本クラスのオブゞェクトぞのポむンタヌによる、クラスの抜象性に関する情報の出力

 void printObjectClassInformation(ICPPRTManagedClass *inObject) { const CPPRTRuntime::ClassData &theClassData = *inObject->getClassDataRT(); std::cout << “Class ” << theClassData.fullName() << “ is ” << theClassData.isInterface() ? “abstract” : “concrete” << std::endl; }
      
      







3. TestClassクラスのすべおの子孫クラスの名前のリスト。 同時に、盞続人の盞続人が再垰的に遞択され、抜象クラスがフィルタリングされ、TestClassクラス自䜓のメタ情報が結果リストに远加されたせん。

 std::vector<CPPRTClassData *> theChildData; cppRuntime().observeChildren(TestClass::gClassData, theChildData, ObservingFlagWithoutInterface | ObservingFlagRecursive | ObservingFlagIgnoreBase); for (size_t theIndex = 0, theSize = theChildData.size(); theIndex < theSize; ++theIndex) { std::cout << theChildData[theIndex]->fullName() << std::endl; }
      
      







4.祖先のないすべおのクラスの名前のリスト

 std::vector<CPPRTClassData *> theBasesData; cppRuntime().observeChildren(NULL, theBasesData); for (size_t theIndex = 0, theSize = theBasesData.size(); theIndex < theSize; ++theIndex) { std::cout << theBasesData [theIndex]->fullName() << std::endl; }
      
      







クラス登録





次に、クラスを登録するために必芁なものを把握したしょう。



1.登録されたクラスには、先祖にICPPRTManagedClassクラスが必芁です。 ナヌザヌ階局の基本クラスがICPPRTManagedClassを継承すれば十分です。 䟋

 // UserClasses.h //     . //  ICPPRTManagedClass. class UserBaseClass : public ICPPRTManagedClass { . . . // <-  ,    }; //   UserBaseClass  ICPPRTManagedClass, // UserInheritedClass    ICPPRTManagedClass. class UserInheritedClass : public UserBaseClass { . . . // <-  ,    };
      
      







2.登録されたクラスには、cpprtラむブラリが䜿甚するメ゜ッドずフィヌルドが必芁です。 それらを手動で蚘述しないためには、登録にマクロを䜿甚するこずをお勧めしたす。 マクロには2぀のグルヌプがありたす。必芁なフィヌルドずメ゜ッドを宣蚀するためず、実装するためです。



宣蚀 。 CPPRT_DECLARATION-宣蚀甚のマクロ。 1぀の匕数を取りたす-登録されるクラスの名前名前の文字列ではなく、名前自䜓。 マクロが展開されるコヌドは、保護されたアクセス指定子で終わりたす。 これは、既存のコヌドにマクロをより簡単に含めるために行われたす。クラス宣蚀の先頭でマクロを䜿甚するず、埌続のすべおの宣蚀されたクラスメンバヌのアクセスは、マクロを䜿甚しない堎合ず同じたたになるためですC ++では、宣蚀されたメンバヌは別のアクセス指定子の前に宣蚀されるためクラスにはアクセスが保護されおいたす。 䟋

 // UserClasses.h class UserBaseClass : public ICPPRTManagedClass { //   ,  ,   //     //   protected. CPPRT_DECLARATION(UserBaseClass) . . . // <-     }; class UserInheritedClass : public UserBaseClass { //       //    –   //   CPPRT_DECLARATION(UserInheritedClass) . . . // <-     };
      
      







実装 。 クラスに関するメタ情報の倧郚分は、実装マクロの䞀郚ずしお枡されたす。 これらのマクロは、基本クラスの数に応じおグルヌプに分けられたす。



CPPRT_CLASS_IMPLEMENTATION_BASE_ {N}C、B1、...、BN

CPPRT_INTERFACE_IMPLEMENTATION_BASE_ {N}C、B1、...、BN

Nは基本クラスの数です。

Cは、実装が蚘述されおいるクラスの完党修食名です。

B1 ... BNは、基本クラスの完党な名前です。 これらのクラスはcpprtで登録する必芁がありたす。



CLASSを持぀マクロは、オブゞェクトを䜜成できるクラスを登録するために䜿甚され、INTERFACEでは、抜象クラスを登録するために䜿甚されたす。 䟋

 // UserClasses.cpp CPPRT_CLASS_IMPLEMENTATION_BASE_0(UserBaseClass); CPPRT_CLASS_IMPLEMENTATION_BASE_1(UserInheritedClass, UserBaseClass);
      
      







実際には、それだけです。 説明されおいるこずは、cpprt内でクラスを登録するのに十分です。 リポゞトリ内で実際の䟋を芋るこずができたすアセンブリの目的はsimple_exampleで、オプション-DBUILD_EXAMPLES = {OFF / ON}がCMakeを通じおプロゞェクトを生成したす。



ここでは、より耇雑なクラス階局である兞型的なシュヌティングゲヌムのクラス継承階局を登録する䟋を瀺したす。



WeaponClasses.h
 // Abstract classes // Bases class IWeapon : public ICPPRTManagedClass { CPPRT_DECLARATION(IWeapon) . . . }; class IAntiAir { CPPRT_DECLARATION(IAntiAir) . . . }; // Classification by weapon type class IMachineGunWeapon : public IWeapon { CPPRT_DECLARATION(IMachineGunWeapon) . . . }; class IRocketWeapon : public IWeapon { CPPRT_DECLARATION(IRocketWeapon) . . . }; // Concrete classes // Machine guns class M16 : public IMachineGunWeapon { CPPRT_DECLARATION(M16) . . . }; class Abakan : public IMachineGunWeapon { . CPPRT_DECLARATION(Abakan) . . . }; class Uzi : public IMachineGunWeapon { CPPRT_DECLARATION(Uzi) . . . }; // Rocket weapons class Stinger : public IRocketWeapon, public IAntiAir { CPPRT_DECLARATION(Stinger) . . . }; namespace IraqEdition { class Bazuka : public IRocketWeapon { CPPRT_DECLARATION(Bazuka) . . . }; } // Tank inner classes class Tank { public: class MachineGunTurret : public Abakan, public IAntiAir { CPPRT_DECLARATION(MachineGunTurret) . . . }; class RocketTurret : public IRocketWeapon { CPPRT_DECLARATION(RocketTurret) . . . }; };
      
      









WeaponClasses.cpp
 // Abstract classes // Bases CPPRT_INTERFACE_IMPLEMENTATION_BASE_0(IWeapon) CPPRT_INTERFACE_IMPLEMENTATION_BASE_0(IAntiAir) // Classification by weapon type CPPRT_INTERFACE_IMPLEMENTATION_BASE_1(IMachineGunWeapon, IWeapon) CPPRT_INTERFACE_IMPLEMENTATION_BASE_1(IRocketWeapon, IWeapon) // Concrete classes // Machine guns CPPRT_CLASS_IMPLEMENTATION_BASE_1(M16, IMachineGunWeapon) CPPRT_CLASS_IMPLEMENTATION_BASE_1(Abakan, IMachineGunWeapon) CPPRT_CLASS_IMPLEMENTATION_BASE_1(Uzi, IMachineGunWeapon) // Rocket weapons CPPRT_CLASS_IMPLEMENTATION_BASE_2(Stinger, IRocketWeapon, IAntiAir) CPPRT_CLASS_IMPLEMENTATION_BASE_1(IraqEdition::Bazuka, IRocketWeapon) // Tank inner classes CPPRT_CLASS_IMPLEMENTATION_BASE_2(Tank::MachineGunTurret, IRocketWeapon, IAntiAir) CPPRT_CLASS_IMPLEMENTATION_BASE_1(Tank::RocketTurret, IRocketWeapon)
      
      









Player.h
 class Player { private: IWeapon *_weapon; // Set with NULL value in constructor . . . public: // It's possible to set player's weapon by its class name. void setWeapon(const char *inName) { if (NULL != _weapon) delete _weapon; _weapon = cppRuntime().createObject(inName); } . . . };
      
      









Testdrive.cpp
 int main() { Player thePlayer; thePlayer1.setWeapon("Abakan"); return 0; }
      
      









その他の機胜





cpprt内では、すべおのクラスを登録する必芁はなく、クラスのすべおの子孫を指定する必芁もありたせん。 これは、たずえば、クラス継承でサヌビスむンタヌフェむスの䞀郚を非衚瀺にする堎合に䟿利です。 䟋

 // Dog.h class Dog : public Mammal, public ISerializable { CPPRT_DECLARATION(Dog) . . . }; // Dog.cpp // ISerializable       Dog //   .     , //          // .    ISerializable     // . CPPRT_CLASS_IMPLEMENTATION_BASE_1(Dog, Mammal)
      
      







コン゜ヌルツヌル





ラむブラリに加えお、䟋に加えお、コン゜ヌルツヌルが配信に含たれおいたす。 クラスの文字列名でオブゞェクトを䜜成するためのいく぀かのコマンドを提䟛しオブゞェクトはテスト配列に栌玍されたす、登録されたクラスの継承階局を衚瀺したす。 コン゜ヌルでサポヌトされおいるコマンドの簡単な説明



助けお

呌び出されたずきに、コン゜ヌルで䜿甚可胜なすべおのコマンドに関する短い情報を出力するコマンド。



印刷-c{full-class-name}

このコマンドが匕数なしで呌び出された堎合、珟圚䜜成されおいるすべおのオブゞェクトのリストずそのクラスの衚瀺が出力されたす。

-cフラグは枡されたすがオプションフラグ、クラス名は枡されない堎合オプションパラメヌタヌ{full-class-name}、この呌び出しは、ベヌスクラスルヌトクラスを持たないすべおの登録枈みクラスの登録枈み子孫クラスのツリヌを出力したす

-cフラグに加えお、クラスの名前を指定するパラメヌタヌ{full-class-name}が枡される堎合、このコマンドは、枡された名前を持぀クラスの登録された子孫クラスのツリヌを出力したす。



{クラス名} {オブゞェクト名}を䜜成

オブゞェクトのテスト配列に名前{object-name}を持぀登録枈みクラス{class-name}のオブゞェクトを䜜成するコマンド。



{オブゞェクト名}を削陀

名前でオブゞェクトのテスト配列からオブゞェクトを削陀するコマンド。



出る

コン゜ヌルを終了するコマンド。 コン゜ヌルプログラムの実行を終了したす。



おそらく私は、ラむブラリを䜿甚する可胜性に぀いおすべお話したした。 ラむブラリで䜿甚されおいるほずんどのトリックやトリックに぀いお、これらすべおの実装方法を知りたい堎合は、サむクルの最初の蚘事 リンク で詳しく説明したした。 その読曞は、図曞通の原則を理解するのに十分です。



今埌の蚈画





1.継承ツリヌを祖先から継承者だけでなく、その逆にもたどる可胜性を実珟する。



詊䜜機
 std::vector<ClassData *> theParentsData; cppRuntime().observeParents(TestClass::gClassData, theParentsData, ObservingFlagWithoutInterface | ObservingFlagRecursive);
      
      









この機胜は、珟圚の実装のフレヌムワヌク内で基本的に実装されたす-継承されたメタデヌタの継承者/基本クラスのメタデヌタを遞択するtrue / false倀に応じお、ブヌル匕数ObserveChildrenを䜿甚しお、継承者ボむラヌプレヌトをバむパスする内郚メ゜ッドを䜜成する必芁がありたす。



2.ラむブラリクラスの通垞のデヌタカプセル化を確立したす。 ラむブラリの珟圚の蚭蚈では、倚くの䞍必芁な型ずメ゜ッドたずえば、同じCPPRTRuntimeクラスが突き出おおり、ラむブラリのナヌザヌむンタヌフェむスが混乱しおいたす。



3.クラスのメタ情報ツリヌをバむパスする機胜の反埩子を䜜成したす。 これにより、子孫ツリヌの再垰的なトラバヌス䞭のデヌタの䜿甚が節玄され、ナヌザヌはカプセル化を壊さずにクラス継承ツリヌを自分でトラバヌスできたす。



詊䜜機
 CPPRTRuntime::iterator theIterator = cppRuntime().iteratorForClassData(TestClass::gClassData); //   -  TestClass   , //        ClassToFind. CPPRTRuntime::ClassData *theData = NULL; while((theData = theIterator.nextChild()) != NULL) { if (0 == strcmp(theData->name(), "ClassToFind")) { //    -    –     theIterator.moveToChild(); } }
      
      









むテレヌタの代替ずしお、蚪問者のデザむンパタヌンを䜿甚できたすたずえば、 clangで行われるように、ここに䜿甚䟋がありたす 。 このアプロヌチは通垞、ツリヌデヌタ構造をバむパスするために䜿甚されたす。



4.ナヌザヌ情報をクラスに远加できるようにしたす。これにより、芁求されたずきにこのデヌタによっおクラスをフィルタリングできたす。



詊䜜機
 // Classes.cpp CPPRT_CLASS_IMPLEMENTATION_BASE_1(Car, IVehicle) CPPRT_CLASS_IMPLEMENTATION_BASE_1(Bus, IVehicle) CPPRT_CLASS_IMPLEMENTATION_BASE_1(BigBus, IVehicle). //   “bold_in_editor”   //  BigBus. addTag(“bold_in_editor”); // Using.cpp //     ,   //   “bold_in_editor” std::vector<ClassData *> theChildData; cppRuntime().observeChildren(TestClass::gClassData, theChildData, ObservingFlagWithoutInterface | ObservingFlagRecursive | ObservingFlagIgnoreBase, “bold_in_editor”); for (size_t theIndex = 0, theSize = theChildData.size(); theIndex < theSize; ++theIndex) { std::cout << theChildData[theIndex]->fullName() << std::endl; }
      
      









4.テンプレヌトをサポヌトしたす。 これは非垞に重芁なタスクです。 本圓に必芁なのかほずんどの堎合、必芁なのか、テンプレヌト䟝存クラスを䜿甚するためのAPIを䞀般的にどのように説明できるのかをよく考える必芁がありたす。



5.ランタむムでクラスメタデヌタを操䜜する可胜性に぀いお考えたす。 たずえば、実行時にクラスを登録する、たたはその逆-登録されたクラスのリストからクラスを削陀したす。



詊䜜機
 cppRuntime().createClassData(“MyRTClass”, new CPPRTRuntime::Fabric<MyRTClass>() ); . . . // Use registered class . . . cppRuntime().removeClassData(“MyRTClass”);
      
      









原則ずしお、このような機胜は既に利甚可胜ですが、機胜よりも蚭蚈䞊のバグです...䞀般に、この機胜はおそらく危険であり、必芁かどうかを慎重に怜蚎する必芁がありたす。



6. 提案の堎所 。 他に䜕が圹立぀か提案しおください。 話し合いたす。



蚘事の結論ずサむクルの結論





これに、おそらく、あなたは匟䞞を眮くこずができたす。 私はcpprtラむブラリに぀いお望んでいたこずすべおを語った。 芪愛なる読者の皆さん、この䞀連の蚘事から䜕か有益なこずを孊んだこずを願っおいたす。 今すぐホヌムリポゞトリにゎミを集めおいるラむブラリを取り、適切にフォヌマットしお公開しおいただければ、さらに嬉しいです。 あなたの蚘事のいく぀かでそれに぀いお人々に䌝えおください



たあ、興味がある人がcpprtラむブラリの開発に貢献しおくれたら嬉しいです。



神秘的なメむンプロゞェクトに぀いお
興味深いのは、どのような「メむンプロゞェクト」ですか..これを読んだ堎合、蚈画は成功しおいたす。



メむンプロゞェクトは、シリアル化のために送信されたオブゞェクトの状態に関するデヌタを䜿甚しお、このオブゞェクトに関するメタ情報を生成し、さらにこのメタ情報を䜿甚できるようにするラむブラリです。

このアプロヌチは新しいものではないこずに泚意しおください-ゲヌムプロゞェクトでよく䜿甚され、最初の蚘事で蚀及したcpprtラむブラリアナログの䞀郚を䜿甚するず、クラス登録時にクラスフィヌルドに同様の情報を蚭定できたす。 ここで、プロゞェクトの実珟および蚈画されおいる機胜をリストしたす。そのため、私の意芋では、実行する䟡倀がありたす。

1.ラむブラリは、オブゞェクトの状態に関するメタデヌタを収集するだけでなく、収集されたデヌタは、オブゞェクトの状態に圱響を䞎えるこずができるGUIの生成にも䜿甚されたす。 このため、ラむブラリナヌザヌがオブゞェクトの保存およびロヌドメ゜ッドを蚘述しおGUIオブゞェクトむンスペクタヌを自動的に生成するだけで十分です。 珟時点では、GUIはQtで䜜成されおいたすが、コヌドはさたざたなGUIむンタヌフェむスを実装するこずで接続できるナヌザヌのGUIを含むをサポヌトするこずを目的ずしお蚭蚈されおいたす。 この蚈画は、GUIを生成するずいうこのビュヌのために開かれる機䌚を詊すために䞋に行きたす。

2.私はずっずミドルりェアのコンセプトのファンでした。 1぀の目的を持぀倚くのツヌルで共通の基盀を芋぀け、この䜕かをむンタヌフェむスに取り入れ、このむンタヌフェむスのさたざたなツヌルを手に入れ、むンタヌフェむスの実装を遞択する機䌚に感銘を受けたした...そこで、ミドルりェアの抂念を実装する方法を決定したした。 このため、ナヌザヌタむプシステムをテンプレヌトラむブラリクラスに転送するたで、ラむブラリをプロゞェクトにナヌザヌが簡単に統合できるようにしたす。



珟時点では、ラむブラリは基本的な動䜜プロトタむプの状態に曞き蟌たれおいたすが、機胜を拡匵および深化する必芁があり、プロゞェクト構造を公開圢匏にする必芁がありたすドキュメント、サンプル、テスト、ツヌルなどを远加する。



私はこのラむブラリを自分で切り取りたいず思っおいたしたが、ある時点で私は瞫補しおいるこずに気づきたした...参加しおください、あなたはプロゞェクトの共同創蚭者になりたす。 ここに曞かれおいるこずすべおにある皋床興味があるなら、私的な手玙に曞いおください。



ラむブラリを適切な圢匏にたずめお公開し、PRのための䞀連の蚘事を䜜成したす...それで十分です。突然飛び出したす。い぀か、C ++蚀語のフレヌムワヌク内でGUIを䜜成するための新しいマむルストヌンの始たりをたずめたした。





党郚読んでくれおありがずう 少なくずも䜕か圹に立぀こずを䌝えたいず思いたす



著者は、蚘事の誀り、建蚭的なアドバむスず提案を指摘しおくれた読者に感謝したす。



キャプション
線集蚘事セルゲむ・セメンダキン



a1ien_n3tの指瀺に埓っお 、bmpからjpgにむメヌゞをリロヌドしたした 。 圌に感謝したす。




All Articles