C++ Object实体类


*暂未完成,因为无尽BUG滚滚来。

好长时间没写完,一是能力不够,二是我还得给老板写WEB的代码。可是我不会WEB!js和PHP简直就是世界上最好的语言,因为它们能够让人更快地进入极乐世界。

让我写一个gm后台,他说好不好看无所谓,能用就行。于是,我就写了一个根据JSON数据自动生成页面的代码……哈哈,平均15分钟完成一个功能,简直不要太爽。懒人自然有懒办法。当然,之前写工具花费了大量时间。

回家还要玩激战2刷每日,还挺忙的……

好吧,我已经没有力气给自己吐槽了。。。所以,直接上代码吧,不废话了。

 

以下代码为C++代码。

简直通俗易懂。

 

接下来(预计实现):

1.结构改造:在代码中定义一个对象的属性关联以及拥有属性是不太方便的,应该将这种关系和数据放置于配置表中。甚至是接下来的事件类和故事(story)类也应当如此。

1.1 首先,需要定义基本动作,

1.2 定义动作指令

1.3 需要一个虚拟机,基于栈的或者是基于寄存器的。还是栈虚拟机实现更简单一点,尽管效率稍差。

1.3.1  图形界面或者脚本程序。前者对于设计师来说更加友好。

1.4 协议。应当将虚拟机生成的字节码翻译成数据发送给主程序处理。

1.5 存储。生成的字节码应该被存储在配置表或者数据库中。

1.6 处理。主程序应该有足够通用、健壮和效率的算法来处理这个字节码。

看来这是一个大工程。

 

2.集中测试(2018.11.1 19:25)

LunaObject.h

  1 #pragma once
  2 
  3 #include "stdinc.h"
  4 #include "Location.h"
  5 #include "QualitiesManager.h"
  6 #include "QualInc.h"
  7 
  8 namespace Lunacia
  9 {
 10     class ObjectInfo final
 11     {
 12     private:
 13         //info name: value pointer
 14         std::unordered_map<std::string, void*> _infos;
 15         std::unordered_map<std::string, std::function<void(const std::string&)>> _destory;
 16 
 17     public:
 18         ObjectInfo();
 19         ObjectInfo(std::unordered_map<std::string, void*>& infos);
 20         ~ObjectInfo();
 21 
 22     public:
 23         template<typename T>
 24         T& Get(const std::string& name)
 25         {
 26             if (!IsExist(name))
 27             {
 28                 ErrorThrow("The data is not exist what name is " + name);
 29             }
 30 
 31             return *(static_cast<T*>(_infos.find(name)->second));
 32         }
 33 
 34         template<typename T>
 35         void Set(const std::string& name, T& val)
 36         {
 37             auto itFound = _infos.find(name);
 38             void* pFound = nullptr;
 39             if (itFound == _infos.end())
 40             {
 41                 Add(name, val);
 42                 return;
 43             }
 44 
 45             pFound = itFound->second;
 46             T* pVal = static_cast<T*>(pFound);
 47             *pVal = val;
 48         }
 49 
 50         template<typename T>
 51         void Replace(const std::string& name, const T& value)
 52         {
 53             Delete<T>(name);
 54             Add(name, value);
 55         }
 56 
 57         template<typename T>
 58         bool Add(const std::string& name, const T& value)
 59         {
 60             T* pValue = new T();
 61             *pValue = value;
 62 
 63             std::function<void(const std::string&)> destoryFunc = [this](const std::string& n)->void
 64             {
 65                 this->Delete<T>(n);
 66             };
 67 
 68             _destory.insert(std::make_pair(name, destoryFunc));
 69             return _infos.insert(std::make_pair(name, static_cast<void*>(pValue))).second;
 70         }
 71 
 72         template<typename T>
 73         bool Delete(const std::string& name)
 74         {
 75             auto itFound = _infos.find(name);
 76             if (itFound == _infos.end())
 77             {
 78                 return false;
 79             }
 80             void* pVal = itFound->second;
 81 
 82             T* pDel = static_cast<T*>(pVal);
 83             delete pDel;
 84             pVal = nullptr;
 85 
 86             _destory.erase(name);
 87             return _infos.erase(name) == 1;
 88         }
 89 
 90         bool IsExist(const std::string& name) const;
 91     };
 92 
 93     //////////LunaObject//////////
 94     class LunaObject
 95     {
 96     public:
 97         LunaObject();
 98         virtual ~LunaObject();
 99 
100     public:
101         virtual void QualitiesCorrelation() = 0;
102 
103     public:
104         virtual ObjectInfo& Info();
105         virtual void Destory();
106 
107 #ifdef __Debug
108     public:
109 #else
110     protected:
111 #endif // __Debug
112         ObjectInfo m_info;
113         QualitiesManager m_qualManager;
114     };
115 
116     ///////////NullObject///////////
117     class NullObject: public LunaObject
118     {
119     private:
120         static NullObject* _instance;
121 
122     private:
123         NullObject();
124 
125     public:
126         friend class ObjectManager;
127         void Destory() override;
128         ObjectInfo& Info() override;
129 
130         static NullObject* const GetInstance();
131 
132     private:
133         void QualitiesCorrelation() override;
134     };
135 
136     extern NullObject NULL_OBJECT;
137     extern NullObject* const NULLPTR_OBJECT;
138 };
139 
140 //#define ADDOBJ(className)   g_ObjectManager.AddObject(#className,new className)

 

LunaObject.cpp

 1 #include "LunaObject.h"
 2 
 3 namespace Lunacia
 4 {
 5     LunaObject::LunaObject()
 6     {
 7     }
 8 
 9     LunaObject::~LunaObject()
10     {
11         Destory();
12     }
13 
14     ObjectInfo & LunaObject::Info()
15     {
16         return m_info;
17     }
18 
19     void LunaObject::Destory()
20     {
21         m_qualManager.Clear();
22     }
23 
24     /**
25     *    @class: NullObject.
26     *  @lazy initializate: false.
27     *  @thread safe: true.
28     *
29     */
30     NullObject* NullObject::_instance = new NullObject();
31 
32     static NullObject* const NULLPTR_OBJECT = NullObject::GetInstance();
33     static NullObject NULL_OBJECT = *NULLPTR_OBJECT;
34 
35     NullObject::NullObject()
36     {
37     }
38 
39     NullObject* const NullObject::GetInstance()
40     {
41         return _instance;
42     }
43 
44     void NullObject::Destory() 
45     {
46         ErrorThrow("Destory Function: It is null object!");
47     }
48 
49     ObjectInfo & NullObject::Info()
50     {
51         ErrorThrow("GetObjectInfo Function: It is null object!");
52         return m_info;
53     }
54 
55     void NullObject::QualitiesCorrelation() 
56     {
57         ErrorThrow("QualitiesCorrelation Function: It is null object!");
58     }
59 
60     //////////////ObjectInfo//////////////
61     ObjectInfo::ObjectInfo()
62     {
63     }
64 
65     ObjectInfo::ObjectInfo(std::unordered_map<std::string, void*>& infos):
66         _infos(infos)
67     {
68     }
69 
70     ObjectInfo::~ObjectInfo()
71     {
72         std::unordered_map<std::string, void*>::iterator it;
73         while (!_infos.empty())
74         {
75             it = _infos.begin();
76 
77             const std::string& name = it->first;
78             (_destory[name])(name);
79         } 
80 
81         _infos.clear();
82         _destory.clear();
83     }
84 
85     bool ObjectInfo::IsExist(const std::string & name) const
86     {
87         if (_infos.find(name) == _infos.end())
88         {
89             return false;
90         }
91         return true;
92     }
93 };

 

ObjectManager.h

 1 #pragma once
 2 
 3 #include "LunaObject.h"
 4 #include "UniqueID.h"
 5 
 6 namespace Lunacia
 7 {
 8     class ObjectManager final
 9     {
10     public:
11         ObjectManager();
12         ~ObjectManager();
13 
14         void Clear();
15 
16     public:
17         int Add(LunaObject * obj);
18 
19         template<class T, typename  std::enable_if <std::is_base_of<LunaObject, T>::value, T> ::type * = nullptr >
20         int Add();
21 
22         template<class T, typename  std::enable_if <std::is_base_of<LunaObject, T>::value, T> ::type * = nullptr >
23         LunaObject* Create();
24 
25         void Remove(int id);
26         LunaObject*const Find(int id);
27         const LunaObject*const Find(int id) const;
28 
29     private:
30         std::map<int, LunaObject*> m_objects;
31     };
32     ///////////////
33 
34     template<class T, typename  std::enable_if <std::is_base_of<LunaObject, T>::value, T> ::type *>
35     inline int ObjectManager::Add()
36     {
37         LunaObject* pObj = Create<T>();
38         return Add(pObj);
39     }
40 
41     template<class T, typename  std::enable_if <std::is_base_of<LunaObject, T>::value, T> ::type *>
42     inline LunaObject * ObjectManager::Create()
43     {
44         return new T();
45     }
46 
47 };

 

ObjectManager.cpp

#include "ObjectManager.h"

namespace Lunacia
{
    ObjectManager::ObjectManager()
    {
    }
    
    ObjectManager::~ObjectManager()
    {
    }

    void ObjectManager::Clear()
    {
        for (auto& itEach : m_objects)
        {
            LunaObject* lo = itEach.second;
            lo->Destory();

            delete lo;
            lo = NULLPTR_OBJECT;
        }
    }

    int ObjectManager::Add(LunaObject * obj)
    {
        int id = static_cast<int>(UniqueID::Get());
        obj->Info().Set("id", id);

        return m_objects.insert(std::make_pair(id, obj)).second ? id : -1;
    }

    void ObjectManager::Remove(int id)
    {
        auto itFound = m_objects.find(id);
        if (itFound != m_objects.end())
        {
            return;
        }
        LunaObject* & pObjFound = itFound->second;
        pObjFound->Destory();

        delete pObjFound;
        pObjFound = NULLPTR_OBJECT;
    }

    LunaObject * const ObjectManager::Find(int id)
    {
        const ObjectManager* pSelf = this;

        return const_cast<LunaObject * const>(pSelf->Find(id));
    }

    const LunaObject * const ObjectManager::Find(int id) const
    {
        auto itFound = m_objects.find(id);
        if (itFound == m_objects.end())
        {
            return NULLPTR_OBJECT;
        }
        return itFound->second;
    }
};

 

Human.h(测试用) (将会被宏代替(一句宏生成一个类))

 1 #pragma once
 2 #include "LunaObject.h"
 3 
 4 namespace Lunacia
 5 {
 6     class Human : public LunaObject
 7     {
 8     public:
 9         Human();
10         ~Human();
11 
12     public:
13         void QualitiesCorrelation() override;
14     };
15 };

 

Human.cpp(测试用)

 1 #include "Human.h"
 2 
 3 namespace Lunacia
 4 {
 5     Human::Human()
 6     {
 7     }
 8 
 9     Human::~Human()
10     {
11     }
12 
13     void Human::QualitiesCorrelation()
14     {
15         //TODO: rebuild at config file.
16         PtrQuality ptrHeal = m_qualManager.AddQuality<QualHealth>();
17         PtrQuality ptrLifeIn = m_qualManager.AddQuality<QualLifeInstinct>();
18         PtrQuality ptrCour = m_qualManager.AddQuality<QualCourage>();
19 
20         ptrHeal->SetLimit(1000);
21         ptrHeal->SetValue(ptrHeal->GetLimit());
22 
23         ptrLifeIn->SetLimit(1000);
24         ptrHeal->SetValue(ptrLifeIn->GetLimit());
25 
26         ptrCour->SetLimit(1000);
27         ptrHeal->SetValue(ptrCour->GetLimit());
28 
29         ptrLifeIn->AddPassive(ptrHeal);
30         ptrHeal->AddPassive(ptrCour);
31 
32         return;
33     }
34 
35 }

 

UniqueID.h(初版,用于测试)

 1 #pragma once
 2 #include "stdinc.h"
 3 
 4 namespace Lunacia
 5 {
 6     //Unique ID Local, not global.
 7     class UniqueID final
 8     {
 9     public:
10         static int64_t Get(int8_t suffix_8bit = 0);
11         static void Load(void* pData);
12 
13     private:
14         static void ReInitPool();
15         
16     private:
17         static const size_t _count = 5000;    //TODO:  Rebuild it.    //The larger the number, the more uniform the distribution.
18         static int _curSize;
19         static int _curMax;    //TODO:  Rebuild it.
20         static std::array<int64_t, _count> _idsPool;
21     };
22 };

 

UniqueID.cpp

 1 #include "UniqueID.h"
 2 #include "Random.h"
 3 
 4 namespace Lunacia
 5 {
 6     int UniqueID::_curMax = 100;
 7     std::array<int64_t, UniqueID::_count> UniqueID::_idsPool;
 8     int UniqueID::_curSize = UniqueID::_count;
 9 
10     int64_t UniqueID::Get(int8_t suffix_8bit)
11     {    
12         if (_curSize >= _idsPool.size() - 1)
13         {
14             ReInitPool();
15         }
16 
17         return (_idsPool[_curSize++] << 8) | suffix_8bit;
18     }
19 
20     void UniqueID::Load(void* pData)
21     {
22     
23     }
24 
25     void UniqueID::ReInitPool()
26     {
27         int curMin = _curMax;
28         _curMax += _count;
29         for (int i = 0; i < _count; ++i)
30         {
31             _idsPool[i] = i + curMin;
32         }
33 
34         for (int n = 0; n < _count - 1; ++n)
35         {
36             uint64_t ran = RandomAvg::GetRandNum(n + 1, _count);
37             std::swap(_idsPool[n], _idsPool[ran]);
38         }
39 
40         _curSize = 0;
41     }
42 };

 

 Encounter.h(测试类)

 1 #include "stdinc.h"
 2 #include "QualDefine.h"
 3 
 4 #pragma once
 5 
 6 namespace Lunacia
 7 {
 8     class Encounter
 9     {
10     public:
11         struct QualInfluence 
12         {
13             QualityType type;
14             int32_t influence;
15         };
16 
17     public:
18         Encounter();
19         ~Encounter();
20 
21     private:
22         QualityType GetRandomType() const;
23         int32_t GetRamdomInfluence() const;
24 
25     public:
26         void GetRandomInfluence(QualInfluence& __out res) const;
27     };
28 
29 };

Encounter.cpp
 1 #include <bitset>
 2 
 3 #include "Encounter.h"
 4 #include "Random.h"
 5 
 6 namespace Lunacia
 7 {
 8 
 9     Encounter::Encounter()
10     {
11         
12     }
13 
14     Encounter::~Encounter()
15     {
16 
17     }
18 
19     QualityType Encounter::GetRandomType() const
20     {
21         int rand = static_cast<int>(RandomAvg::GetRandNum(1, static_cast<uint32_t>(QualityType::__QualityType_MAX)));
22         return static_cast<QualityType>(rand);
23     }
24 
25     int32_t Encounter::GetRamdomInfluence() const
26     {
27 
28         return g_rn.GetRandNum<int32_t>() * static_cast<int>(std::pow(-1, RandomAvg::GetRandNum() % 2));
29     }
30 
31     void Encounter::GetRandomInfluence(QualInfluence& res) const
32     {
33         res.type = GetRandomType();
34         res.influence = GetRamdomInfluence();
35     }
36 };

 

 

_main.cpp(测试用主函数)

  1 #include "Tilee.h"
  2 #include "Location.h"
  3 #include "stdinc.h"
  4 #include "Random.h"
  5 #include "Rational.h"
  6 
  7 #include "ObjectManager.h"
  8 #include "QualHealth.h"
  9 #include "QualLifeInstinct.h"
 10 
 11 #include "LunaObject.h"
 12 #include "Human.h"
 13 #include "UniqueID.h"
 14 #include "UClock.h"
 15 
 16 #include "Encounter.h"
 17 
 18 using namespace Lunacia;
 19 
 20 ObjectManager* pOm = new ObjectManager();
 21 std::vector<LunaObject*> g_objs;
 22 
 23 RandomItem<LunaObject*> * g_ri;
 24 Encounter g_ec;
 25 
 26 const std::function<uint64_t(const LunaObject* const &)>& GetWeightFunc = [](const LunaObject*const & obj) -> uint64_t
 27 {
 28     const Quality* const res = obj->m_qualManager.GetQuality(QualityType::HEALTH);
 29     if (res == nullptr)
 30     {
 31         return 0l;
 32     }
 33 
 34     return res->GetValue();
 35 };
 36 
 37 void loop() 
 38 {
 39     Encounter::QualInfluence eqi;
 40     g_ec.GetRandomInfluence(eqi);
 41 
 42     LunaObject* const pObj = g_ri->GetRandItem();
 43     Quality* const res = pObj->m_qualManager.FindQuality(eqi.type);
 44 
 45     if (res == nullptr)
 46     {
 47         return;
 48     }
 49     res->AddValue(eqi.influence);
 50 
 51     std::cout<<"ID: " << pObj->Info().Get<int>("id") << "    " << static_cast<int64_t>(eqi.type) << " :  "<< eqi.influence << std::endl;
 52 }
 53 
 54 void init(int count)
 55 {
 56     for (size_t i = 0; i < count; i++)
 57     {
 58         LunaObject* h = pOm->Create<Human>();
 59         h->QualitiesCorrelation();
 60 
 61         int id = pOm->Add(h);
 62 
 63         g_objs.push_back(h);
 64     }
 65 
 66     g_ri = new RandomItem<LunaObject*>(g_objs, GetWeightFunc);
 67 }
 68 
 69 int main(void)
 70 {    
 71     init(100);
 72     const int64_t RateBase = 10000;
 73 
 74     int64_t Rate = RateBase / 100;
 75     UClock uck;
 76     
 77     int64_t pre = GetCurrentTime();
 78     int64_t e = 0;
 79     int64_t cur = 0;
 80     uint64_t i = 0;
 81 
 82     //TEST: Loop
 83     while (true) 
 84     {
 85         cur = GetCurrentTime();
 86         e += cur - pre;
 87         pre = cur;
 88 
 89         while (e >= Rate)
 90         {
 91             loop();
 92             e -= Rate;
 93             i++;
 94             //std::cout << e << std::endl;
 95         }
 96 
 97         if (i >= 10000)
 98         {
 99             i = 0;
100             delete g_ri;
101             g_ri = new RandomItem<LunaObject*>(g_objs, GetWeightFunc);
102             system("cls");
103         }
104     }
105 
106     system("pause");
107     return 0;
108 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM