構造使用類C語言的指令碼引擎(1)作者 :kevin_qing轉貼請註明需求:實現npc邏輯,與遊戲(伺服器)互動。例如與商人NPC對話開啟買賣物品視窗等設計:參考傳奇2伺服器端指令碼後(實現的很爛),定義指令碼規則如下:1.採用類C語言,因為熟悉C的人很多,而且C文法較嚴謹,且使用方便2.資料類型只支援int和const
從最簡單的入手1.實現一個固定大小的allocator//分配固定大小記憶體塊的模板類,內部緩衝演算法自己實現了,//我用的是預分配+回收cache鏈//即分配時先檢查回收鏈有無資料,無的話每次分配n*size個塊,然後返回其中一個,直到該塊用完後繼續分配//釋放時直接加入回收鏈即可//好處是速度夠塊,但是浪費空間可能就比較大了template <size_t size> class Fix_Allocator{void* alloc(size_t size);void
數字轉字串:用C++的streanstream:#include <sstream>#Include <string>string num2str(double i)...{ stringstream ss; ss<<i; return ss.str();} 字串轉數字:int str2num(string s) ...{ int num; stringstream ss(s);
c語言不支援函數重載,如果定義兩個同樣的函數,會報錯。eg://test.c#include <stdio.h>#include <stdlib.h>int add(int a,int b){ return a+b;}int add(int a,int b,int c){ return a+b+c;}int main(int argc,char * argv[]){ if(argc!=3 && argc != 4) {
模版 函數模版聲明template<class T>T max(T X,T Y){ return (x>y)?x:y;} 注意:執行個體化T的各模版實參之間必須保持完全一致的類型 模版類定義template<class Type>class stack{void push(Type ch);Type pop();} 類外定義push poptemplate<class Type>void stack<Type>::push(Type ob)
結構體變數所佔記憶體長度是各成員占的記憶體長度的總和。每個成員分別佔有其自己的記憶體單元。共用體變數所佔的記憶體長度等於最長的成員長度。 注意點: 1.共用體變數中起作用的成員時最後一次存放的成員,在存入一個新成員後原有的成員就失去作用。 2.不能把共用體變數作為函數參數,也不能使函數帶回共用體變數,但可以使用變數的指標。 枚舉類型:enum weekday{sun,mon,tue,wnd,thu,fri,sat};注意點:
文章目錄 關於...的使用錯誤的嵌套-Misnesting由操作符優先順序引起的問題-Operator Precedence Problem消除多餘的分號-Semicolon SwallowingDuplication of Side Effects 轉至
計算2進位數中1的個數,主要用到m&(m-1) 交換a,b不用中間變數,用異或:a=a^b;b=a^b;a=a^b sizeof不是函數,它是個類似宏定義的特殊關鍵字,只要是指標,大小就是4. 靜態變數時存放在全域資料區的,而sizeof計算棧中分配的大小,是不會計算在內的。sizeof(虛函數)(類)class no_virtual{public: void fun1() const{} int fun2() const { return a;
char c[] = "hello world" 分配局部數組char* c = "hello world" 分配全域數組 全域地區的值是不能進行修改的 1 常量指標!如 int b, c; int * const a = &b; 表示a是一個常量指標它指向變數b的記憶體。但是因為是常量指標所以不能再用a指向其他變數,如 a = &c; 錯誤!可以修改指向記憶體的值,如:*a = 20; BTW 常量指標聲明的時候必須向我那樣賦初值。 2 指向常量的指標!如 int
左移運算大多數情況下可以看成是乘法運算(除去高位溢出的情況),但是顯然比乘法運算快很多。注意點:如果一個位元組長的數64 (01000000)則左移兩位後值變為0 右移運算:移到右端的低位被捨棄,對無符號數,高位補0. 對於有符號數,正數還是補零,但是負數的話,符號位原來是1,則左移移入0還是1,取決於電腦系統 移入0的稱為邏輯右移,移入1的稱為算術右移 迴圈移位:假設整數問為2位元組
對簡單對象來說,記憶體結構布局很簡單,遵循以下描述:1、非待用資料成員是影響對象所佔據記憶體大小的主要因素,隨著對象的增加而增加;2、所有對象共用一份待用資料成員,用sizeof計算對象大小時不會包含待用資料成員佔據記憶體的大小;3、靜態成員函數和非靜態成員函數不影響對象記憶體的大小;4、如果對象中包含虛函數,會增加4位元組的空間用來儲存虛函數表指標。 對單繼承類,遵循如下描述:在衍生類別執行個體頭部存在一個基類執行個體,虛函數表與基類公用一個。基類的記憶體布局和簡單對象的記憶體布局一樣,衍生類
記憶體對齊。對下面的類: class B{ public:int m_a; short int m_b; double m_c private: int m_d; public: int GetValue(){ return m_c; }
最近做一個項目,使用了一個抽象類別的線程類,使用的時候發現有時會出現調用純虛函數的情況,代碼如下:class Thread{public:Thread(int InitFlag=CREATE_SUSPENDED);~Thread();HANDLE m_ThreadHdl;private:virtual bool Execute()=0;static unsigned __stdcall threadPro( LPVOID pParam);};Thread::Thread(int
背景Google的開源項目大多使用C++開發。每一個C++程式員也都知道,C++具有很多強大的語言特性,但這種強大不可避免的導致它的複雜,這種複雜會使得代碼更易於出現bug、難於閱讀和維護。本指南的目的是通過詳細闡述在C++編碼時要怎樣寫、不要怎樣寫來規避其複雜性。這些規則可在允許代碼有效使用C++語言特性的同時使其易於管理。風格,也被視為可讀性,主要指稱管理C++代碼的習慣。使用術語風格有點用詞不當,因為這些習慣遠不止原始碼檔案格式這麼簡單。使代碼易於管理的方法之一是增強代碼一致性,讓別人可以
範圍1. 命名空間(Namespaces)在.cc檔案中,提倡使用不具名的命名空間(unnamed namespaces,譯者註:不具名的命名空間就像不具名的類一樣,似乎被介紹的很少:-()。使用具名命名空間時,其名稱可基於項目或路徑名稱,不要使用using指示符。定義:命名空間將全域範圍細分為不同的、具名的範圍,可有效防止全域範圍的命名衝突。優點:命名空間提供了(可嵌套)命名軸線(name
關於類的注意事項,總結一下:1. 不在建構函式中做太多邏輯相關的初始化; 2. 編譯器提供的預設建構函式不會對變數進行初始化,如果定義了其他建構函式,編譯器不再提供,需要編碼者自行提供預設建構函式;3. 為避免隱式轉換,需將單參數建構函式聲明為explicit;……類類是C++中基本的代碼單元,自然被廣泛使用。本節列舉了在寫一個類時要做什麼、不要做什麼。 1.
公司今天對我們進行技能考核,本人覺得非常無聊!裡面居然有一個可以被稱為古董的問題:如何使用c++程式查看作業系統的位元(16 位 or 32位),不能使用sizeof()函數 這個問題本身好像就是一個非常複雜的問題,程式去查看作業系統的位元,我個人覺得應該是一個很高深的問題,在Windows下應該有相應的API函數的。不知道不同版本的編譯器對是怎樣來進行處理這個問題的。我在試題上的原始碼:#include <iostream>#include
5 範圍、模板和C++其他特性 5.1 範圍 原則5.1 使用名字空間進行歸類,避免符號衝突 說明:名字空間主要解決符號衝突問題。 樣本:兩個不同項目的全域範圍都有一個類 Foo, 這樣在編譯或運行時造成衝突。如果每個項目將 代碼置於不同名字空間中 namespace project1 { class Foo; //… } namespace project2 { class Foo;
7 異常與錯誤處理 7.1 異常 異常是C++語言的一個強大特性,在正確使用之前需要深入瞭解,以及使用異常代碼的上下文。 原則7.1 減少不必要的異常 說明:異常對編碼技能要求更高,使用中容易出錯,首先從安全性角度考慮,盡量少用或者不用異常。 相比返回錯誤,異常的優點: 異常可以集中捕捉,錯誤偵測與演算法處理相分離,演算法邏輯更清晰;而返回錯誤在每個返回點都 要進行檢測與錯誤處理,代碼邏輯分散。
2 初始化和類型轉換 2.1 聲明、定義與初始化 規則2.1 禁止用memcpy、memset初始化非POD對象 說明:POD 全稱是“Plain Old Data”,是C++ 98標準(ISO/IEC 14882, first edition, 1998-09-01)中引入的一個概念, POD類型主要包括int, char, float,double,enumeration,void,指標等原始