From 3db771e9d920b1e901e5e8d59bedf9fd85fbaba5 Mon Sep 17 00:00:00 2001 From: sauron Date: Tue, 7 Oct 2025 18:27:05 +0900 Subject: [PATCH] commit 2025-10-07 18:26 add TypeMain in ZCppMain/ZtCLinkList.H --- ZCppMain/ZtCLinkList.H | 151 ++++++++++++++++---- ZCppMain/ZtCObjList.H | 5 +- ZCppMainTest/ZtCLinkList_001.cpp | 298 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 425 insertions(+), 29 deletions(-) create mode 100644 ZCppMainTest/ZtCLinkList_001.cpp diff --git a/ZCppMain/ZtCLinkList.H b/ZCppMain/ZtCLinkList.H index 2e7ee40..96099f2 100644 --- a/ZCppMain/ZtCLinkList.H +++ b/ZCppMain/ZtCLinkList.H @@ -28,6 +28,30 @@ -- 2025-10-07 12:23 + + ZNsIFaceEx::ZtCLink 는 TypeData 라는 자료형을 갖는데, ZtCLink 이 + + 상속 클래스가 있다면, 그 상속 클래스 + 기반 클래스만 있다면, 그 기반 클래스 + + 를 나타낸다. 상속 클래스도 기반 클래스도 없다면, 자기 자신을 나타낸다. + + -- 2025-10-07 17:18 + + + ZNsIFaceEx::ZtCLink 는 TypeMain 이라는 자료형을 갖는데, ZtCLink 이 + + 상속 클래스가 있다면, 그 상속 클래스 + 상속 클래스가 없다면, 클래스 자기 자신 + + 를 나타낸다. 그래서 ZtCLinkList 에서 new 로 객체를 만들 때, + + ZtCLink* my=new TypeMain; + + 처럼 쓸 수 있게 한다. + + -- 2025-10-07 17:49 + ■ class ZtCLinkMoveList 은 고정적으로 맨 앞과 맨 뒤를 가상으로 표시하는 링크 객체를 멤 버로 가지고 있다. 그래서 중간에서 링크 자료를 떼어 내어 다른 리스트로 옮길 때, 그 링 크가 리스트의 앞이나 뒤가 아닌, 무조건 중간에 존재한다고 가정하고 빠르게 떼어낼 수 있 @@ -99,6 +123,8 @@ namespace ZNsMain typedef ZtCLink TypeThis ; typedef TTypBase TypeBase ; typedef TChild TypeChild; + typedef TChild TypeData ; + typedef TChild TypeMain ; typedef ZTypLong TypeSize ; protected: ZtCLink* mp_NextLink; @@ -147,6 +173,11 @@ namespace ZNsMain }/* ZtCLink(const TTypBase& rhs)*/ + virtual ~ZtCLink() + { + }/* + virtual ~ZtCLink()*/ + ZtCLink& operator=(const ZtCLink& rhs) { @@ -167,8 +198,8 @@ namespace ZNsMain ZtCLink& operator=(TypeBase& AR_CBase)*/ - /***/ TypeBase& operator()() { return *static_cast< TypeBase*>(this); } - const TypeBase& operator()() const{ return *static_cast(this); } + /***/ TypeData& operator()() { return *static_cast< TypeData*>(this); } + const TypeData& operator()() const{ return *static_cast(this); } ZtCLink* GetNextPtr(){return mp_NextLink;} @@ -318,6 +349,8 @@ namespace ZNsMain typedef ZtCLink TypeThis ; typedef TTypBase /*+++++++++++++*/ TypeBase ; typedef ZCEmpty /*+++++++++++++*/ TypeChild; + typedef TypeBase /*+++++++++++++*/ TypeData ; + typedef TypeThis /*+++++++++++++*/ TypeMain ; typedef ZTypLong /*+++++++++++++*/ TypeSize ; protected: ZtCLink* mp_NextLink; @@ -524,13 +557,15 @@ namespace ZNsMain public : typedef ZtCLink TypeThis ; - typedef ZCEmpty /*+++++++++++*/ TypeBase ; - typedef TChild /*+++++++++++*/ TypeChild; - typedef ZTypLong /*++++++++++++*/ TypeSize ; + typedef ZCEmpty /*++++++++++*/ TypeBase ; + typedef TChild /*++++++++++*/ TypeChild; + typedef TypeChild /*++++++++++*/ TypeData ; + typedef TypeChild /*++++++++++*/ TypeMain ; + typedef ZTypLong /*++++++++++*/ TypeSize ; protected: ZtCLink* mp_NextLink; ZtCLink* mp_PrevLink; - protected: + protected: //////////////////////////////////// static void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink) { @@ -546,8 +581,24 @@ namespace ZNsMain }/* static void MakeRing(ZtCLink* AP_HeadLink, ZtCLink* AP_TailLink)*/ - /*protected:*/ - public : + protected: ///////////////////////////////////////////// + + TypeChild& GetChildObj() + { + return *static_cast(this); + }/* + TypeChild& GetChildObj()*/ + + const TypeChild& GetChildObj() const + { + return *static_cast(this); + }/* + const TypeChild& GetChildObj() const*/ + + protected: ///////////////////////////////////////////// + + // 생성자와 복사 생성자를 protected 영역에 두어서, + // 상속 클래스를 만드는 것을 강제한다. ZtCLink() { @@ -563,15 +614,39 @@ namespace ZNsMain }/* ZtCLink(const TypeThis& rhs)*/ + public : ///////////////////////////////////////////// + + virtual ~ZtCLink() + { + /*///////////////////////////////////////////// + + ■ ZtCLink 는 상속을 하려고 + 설계한 것이라, 소멸자를 virtual 로 만든다. + 그러니까 아래 코드처럼 작성해야 할 때가 있 + 을 것이다. + + TypeThis* myp = new TypeChild; + + // some code + + delete myp; + + -- 2025-10-07 16:31 + + /////////////////////////////////////////////*/ + }/* + virtual ~ZtCLink()*/ + + TypeThis& operator=(const TypeThis& rhs) { - return *this; + this->GetChildObj() = rhs.GetChildObj(); return *this; }/* TypeThis& operator=(const TypeThis& rhs)*/ - /***/ TypeThis& operator()() { return *this; } - const TypeThis& operator()() const{ return *this; } + /***/ TypeData& operator()() { return GetChildObj(); } + const TypeData& operator()() const{ return GetChildObj(); } ZtCLink* GetNextPtr(){return mp_NextLink;} ZtCLink* GetPrevPtr(){return mp_PrevLink;} @@ -717,6 +792,8 @@ namespace ZNsMain typedef ZtCLink TypeThis ; typedef ZCEmpty /*++++++++++++*/ TypeBase ; typedef ZCEmpty /*++++++++++++*/ TypeChild; + typedef TypeThis /*++++++++++++*/ TypeData ; + typedef TypeThis /*++++++++++++*/ TypeMain ; typedef ZTypLong /*++++++++++++*/ TypeSize ; protected: ZtCLink* mp_NextLink; @@ -737,8 +814,8 @@ namespace ZNsMain }/* static void MakeRing(ZtCLink* AP_HeadLink, ZtCLink* AP_TailLink)*/ - /*protected:*/ - public : + /*protected: +++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ + public : /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ ZtCLink() { @@ -761,6 +838,10 @@ namespace ZNsMain TypeThis& operator=(const TypeThis& rhs)*/ + /***/ TypeThis& operator()() { return *this; } + const TypeThis& operator()() const{ return *this; } + + ZtCLink* GetNextPtr(){return mp_NextLink;} ZtCLink* GetPrevPtr(){return mp_PrevLink;} @@ -911,6 +992,8 @@ namespace ZNsMain typedef TCLink ZCLink ; typedef TCLink TypeData; typedef TTypSize TypeSize; + public : + typedef typename TCLink::TypeMain TypeMain; private: ZCLink* mp_HeadLink; ZCLink* mp_TailLink; @@ -923,19 +1006,25 @@ namespace ZNsMain }/* TypeChild& GetChildObj()*/ + const TypeChild& GetChildObj() const + { + return *static_cast(this); + }/* + const TypeChild& GetChildObj() const*/ + private: ZCLink* NewLink() { - return new ZCLink; + return new TypeMain; }/* ZCLink* NewLink()*/ ZCLink* NewLink( ZCLink& AR_ArgData) - { return new ZCLink(AR_ArgData); } + { return new TypeMain(AR_ArgData); } ZCLink* NewLink(const ZCLink& AR_ArgData) - { return new ZCLink(AR_ArgData); } + { return new TypeMain(AR_ArgData); } void NewLink //////////////////////////////////////// ( @@ -945,7 +1034,7 @@ namespace ZNsMain ) ///////////////////////////////////////////////////// { - APR_HeadLink = new ZCLink; + APR_HeadLink = new TypeMain; ZCLink* VP_MakeLink = 0 ; ZCLink* VP_TailLink = APR_HeadLink; @@ -954,7 +1043,7 @@ namespace ZNsMain { // AL_NeedCnt - 1 번 순환 - VP_MakeLink = new ZCLink; + VP_MakeLink = new TypeMain; ZCLink::JoinLink (VP_TailLink, VP_MakeLink); @@ -986,14 +1075,14 @@ namespace ZNsMain ZCLink* VP_TailLink = 0 ; VP_TailLink = VP_MakeLink = - new ZCLink(**AP_LinkOrgin) ; + new TypeMain(*AP_LinkOrgin) ; APR_HeadCopy = VP_MakeLink; while(--AL_FarNum >= 0) { - AP_LinkOrgin= AP_LinkOrgin->GetNextPtr(); - VP_MakeLink = new ZCLink(**AP_LinkOrgin); + AP_LinkOrgin= AP_LinkOrgin->GetNextPtr() ; + VP_MakeLink = new TypeMain(*AP_LinkOrgin); ZCLink::JoinLink (VP_TailLink, VP_MakeLink); @@ -1943,6 +2032,8 @@ namespace ZNsMain typedef TCLink ZCLink ; typedef TCLink TypeData; typedef TTypSize TypeSize; + public : + typedef typename TCLink::TypeMain TypeMain; private: ZCLink mo_HeadFake; // 고정된 가상의 맨 앞 링크 객체 ZCLink mo_TailFake; // 고정된 가상의 맨 뒤 링크 객체 @@ -1958,6 +2049,12 @@ namespace ZNsMain }/* TypeChild& GetChildObj()*/ + const TypeChild& GetChildObj() const + { + return *static_cast(this); + }/* + const TypeChild& GetChildObj() const*/ + private: ZCLink* NewLink() @@ -1967,10 +2064,10 @@ namespace ZNsMain ZCLink* NewLink()*/ ZCLink* NewLink( ZCLink& AR_ArgData) - { return new ZCLink(AR_ArgData); } + { return new TypeMain(AR_ArgData); } ZCLink* NewLink(const ZCLink& AR_ArgData) - { return new ZCLink(AR_ArgData); } + { return new TypeMain(AR_ArgData); } void NewLink //////////////////////////////////////// ( @@ -1980,7 +2077,7 @@ namespace ZNsMain ) ///////////////////////////////////////////////////// { - APR_HeadLink = new ZCLink; + APR_HeadLink = new TypeMain; ZCLink* VP_MakeLink = 0 ; ZCLink* VP_TailLink = APR_HeadLink; @@ -1989,7 +2086,7 @@ namespace ZNsMain { // AL_NeedCnt - 1 번 순환 - VP_MakeLink = new ZCLink; + VP_MakeLink = new TypeMain; ZCLink::JoinLink (VP_TailLink, VP_MakeLink); @@ -2021,14 +2118,14 @@ namespace ZNsMain ZCLink* VP_TailLink = 0 ; VP_TailLink = VP_MakeLink = - new ZCLink(**AP_LinkOrgin) ; + new TypeMain(*AP_LinkOrgin) ; APR_HeadCopy = VP_MakeLink; while(--AL_FarNum >= 0) { AP_LinkOrgin= AP_LinkOrgin->GetNextPtr(); - VP_MakeLink = new ZCLink(**AP_LinkOrgin); + VP_MakeLink = new TypeMain(*AP_LinkOrgin); ZCLink::JoinLink (VP_TailLink, VP_MakeLink); diff --git a/ZCppMain/ZtCObjList.H b/ZCppMain/ZtCObjList.H index a5fb739..b08a953 100644 --- a/ZCppMain/ZtCObjList.H +++ b/ZCppMain/ZtCObjList.H @@ -522,8 +522,9 @@ namespace ZNsMain ) /////////////////////////////////////////////////////////////////*/ - - /*private :*/ + /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + private : + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ public : diff --git a/ZCppMainTest/ZtCLinkList_001.cpp b/ZCppMainTest/ZtCLinkList_001.cpp new file mode 100644 index 0000000..9a3114a --- /dev/null +++ b/ZCppMainTest/ZtCLinkList_001.cpp @@ -0,0 +1,298 @@ + + +#include +#include +#include "ZCppMain/ZtCLinkList.H" + + +using namespace std ; +using namespace ZNsMain ; + + +namespace ZNsMain +{ + + namespace ZNsExam + { + + template class ZtCExamCLinkList + { + public: + + class ZCLinkData : public ZNsIFaceEx::ZtCLink + { + private: + string mo_DataCStr; + private: + static int SI_CallCnt; + public : + typedef ZNsIFaceEx::ZtCLink TypeBase; + public : + + ZCLinkData() : ZNsIFaceEx::ZtCLink() + { + cout<<"* ZCLinkData() : "<<++ZCLinkData::SI_CallCnt<(), + mo_DataCStr(rhs.mo_DataCStr) + {cout<<"* ZCLinkData(const ZCLinkData& rhs) : "<<++ZCLinkData::SI_CallCnt<*/ + + + typedef ZNsIFaceEx::ZtCLink + ZCLinkBase; + + public: + typedef ZCLinkData ZCLinkCStr ; + typedef ZtCLinkList ZCLinkStrList; + typedef typename + ZCLinkStrList::ZCLinkOpt ZCStrLinkOpt ; + public: + + + static void ShowNode0(ZCLinkBase& AR_CLink, ZTypLong& ARRI_CallCnt) + { + ++ARRI_CallCnt; + + cout< class ZtCExamCLinkList*/ + + + + template int + ZtCExamCLinkList::ZCLinkData::SI_CallCnt(0) ; + + + }/* + namespace ZNsExam*/ + +}/* +namespace ZNsMain*/ + + +int main(int AI_ArgCnt, char* APP_ArgVal[]) +{ + return ZNsMain::ZNsExam:: + + ZtCExamCLinkList<>::Main(AI_ArgCnt, APP_ArgVal); +}/* +int main(int AI_ArgCnt, char* APP_ArgVal[])*/ + + +/*//////////////////////////////////////////////////////////////////////////////////////// + + cygwin + + // g++ -mno-cygwin -o ZtCLinkList_001.exe ZtCLinkList_001.cpp -I../../my_CPP/CPP_Main/ -I../../my_CPP/CPP_Std/ -D__CYGWIN32__ -D__VISUAL_CPP_VER__=200300 + // g++ -mno-cygwin -o ZtCLinkList_001_D.exe ZtCLinkList_001.cpp -I../../my_CPP/CPP_Main/ -I../../my_CPP/CPP_Std/ -D__CYGWIN32__ -D__VISUAL_CPP_VER__=200300 -D_DEBUG + + mingw + + g++.exe -o ZtCLinkList_001_mw.exe ZtCLinkList_001.cpp -I../ -lWs2_32 + g++.exe -o ZtCLinkList_001_mw_D.exe ZtCLinkList_001.cpp -I../ -lWs2_32 -D_DEBUG + + ./ZtCLinkList_001_mw.exe + ./ZtCLinkList_001_mw_D.exe + + + Administrator@q381-2673 UCRT64 /e/my_CPP/ZCpp/ZCppMainTest + # date + Sun Aug 24 10:47:09 KST 2025 + + Administrator@q381-2673 UCRT64 /e/my_CPP/ZCpp/ZCppMainTest + # g++ --version + g++.exe (Rev2, Built by MSYS2 project) 13.2.0 + Copyright (C) 2023 Free Software Foundation, Inc. + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + + Linux + + g++ -std=c++98 -o ZtCLinkList_001.exe ZtCLinkList_001.cpp -I../ + g++ -std=c++98 -o ZtCLinkList_001_D.exe ZtCLinkList_001.cpp -I../ -D_DEBUG + + sauron@q381-2673:/mnt/e/my_CPP/ZCpp/ZCppMainTest$ gcc --version + gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0 + Copyright (C) 2019 Free Software Foundation, Inc. + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + sauron@q381-2673:/mnt/e/my_CPP/ZCpp/ZCppMainTest$ date + Sun Aug 24 00:05:51 DST 2025 + + sauron@q381-2673:/mnt/e/my_CPP/ZCpp/ZCppMainTest$ cat /etc/os-release + NAME="Ubuntu" + VERSION="20.04.6 LTS (Focal Fossa)" + ID=ubuntu + ID_LIKE=debian + PRETTY_NAME="Ubuntu 20.04.6 LTS" + VERSION_ID="20.04" + HOME_URL="https://www.ubuntu.com/" + SUPPORT_URL="https://help.ubuntu.com/" + BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" + PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" + VERSION_CODENAME=focal + UBUNTU_CODENAME=focal + + + [sauron@q381-2657 ZCppMainTest]$ cat /etc/centos-release + CentOS Linux release 7.9.2009 (Core) + + [sauron@q381-2657 ZCppMainTest]$ g++ --version + g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44) + Copyright (C) 2015 Free Software Foundation, Inc. + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + + + ./ZtCLinkList_001.exe + ./ZtCLinkList_001_D.exe + +////////////////////////////////////////////////////////////////////////////////////////*/