1. 程式人生 > 其它 >面向物件程式設計(C++): 實驗4 靜態成員

面向物件程式設計(C++): 實驗4 靜態成員

@ 目錄

實驗要求

設計一個玩家類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;
}