面向物件程式設計(C++): 實驗4 靜態成員
阿新 • • 發佈:2022-03-26
@ 目錄
實驗要求
設計一個玩家類Gamer,包含以下成員:
資料成員:賬號id,暱稱name,得分score,金幣money,玩家人數count;
函式成員:設定玩家資訊,輸出玩家資訊;充值金幣;消耗金幣;統計玩家總人數,所有玩家得分平均值,建構函式,解構函式;
請程式設計序,實現玩家金幣充值、花費功能,並且計算出遊戲的平均得分。要求用靜態資料成員和靜態成員函式,函式功能實現請自行補充,繪製類圖。
實驗分析
本次實驗側重點是靜態成員,在要求建立的成員中,我們能用到靜態成員
有玩家人數
和所有玩家得分平均值
實驗中遇到的坑
-
錯誤提示:
error LNK2019: 無法解析的外部符號 "private: static int CGamer::m_count" (?m_count@CGamer@@0HA),函式 "public: __cdecl CGamer::CGamer(int,char *)" (??0CGamer@@QEAA@HPEAD@Z) 中引用了該符號
- 原因分析:用到了靜態資料成員,還沒初始化造成的
- 解決方法:
-
嘗試建立時初始化,失敗
-
嘗試類外初始化,成功
-
-
錯誤提示:
error C2724: “CGamer::getcount”:“static”不應在檔案範圍內定義的成員函式上使用
-
原因分析:static只需要加在類定義裡,類定義外面的函式定義前不能寫static
-
解決方法:類外函式刪掉static
-
實驗原始碼
#include<iostream> using namespace std; class CGamer { int m_id,m_money,m_score; static int m_count,m_averagescore; char *m_name; public: CGamer(int id,char* name); static int getCount(); static int getAveragescore(); void setPlayer(int id,char* name); void showPlayer(); void chaegeMoney(unsigned int money); void useMoney(unsigned int money); ~CGamer(){delete []m_name;}; }; CGamer::CGamer(int id=0,char* name="default") { m_id = id; m_score=0; m_money=0; m_count++; m_name=name; } int CGamer::m_count = 0; int CGamer::m_averagescore = 0; int CGamer::getCount() { return m_count; } int CGamer::getAveragescore() { return m_averagescore; } void CGamer::setPlayer(int id,char* name) { m_id = id; m_name = name; } void CGamer::showPlayer() { cout << "id:[" << m_id << "]\n" << "name:[" << m_name << "]\n" << "score:[" << m_score << "]\n" << "money:[" << m_money << "]\n" << "cout:[" << m_count << "]\n" << "averagescore:[" << m_averagescore << "]" << endl; } void CGamer::chaegeMoney(unsigned int money) { m_money += money; } void CGamer::useMoney(unsigned int money) { m_money -= money; m_score=money;//積分獲取方式,累計消費 m_averagescore+=(m_score/m_count);//所有玩家得分平均值 } int main() { CGamer _A,_B; _A.setPlayer(4,"course04"); _A.chaegeMoney(100); _A.useMoney(90); _A.showPlayer(); _B.setPlayer(44,"course044"); _B.chaegeMoney(444); _B.useMoney(111); _B.showPlayer(); system("pause"); return 0; }