需求重述
- 基類
Game 含純虛函式 start()、訪問次數 visitCount、名稱。
- 三個衍生類
GGame1/2/3 實作 start()。
- 主選單顯示遊戲列表,依
visitCount 遞減排序。
- 使用者選擇遊戲 → 執行 → 返回選單,計數 +1。
關鍵修正點
- 基類指標陣列指向衍生物件合法:
Game* games[3] = {new GGame1, new GGame2, new GGame3}; 利用**多態**,呼叫 games[i]->start() 會動態綁定到衍生類實作。
- 排序需自訂比較函式:
std::sort 配合 lambda 或函式物件,比較 visitCount。
- 選單函式接收指標陣列:
void menu(Game** games, int n) 或 void menu(Game* games[], int n)。
- 記憶體釋放**:迴圈結束前
delete 每個指標。
完整可編譯程式碼 (C++11)
#include
#include
#include
#include // 智慧指標
using namespace std;
class Game {
protected:
string name;
int visitCount = 0;
public:
Game(string n) : name(move(n)) {}
virtual ~Game() = default;
virtual void start() = 0;
void addVisit() { ++visitCount; }
int getVisitCount() const { return visitCount; }
void showName() const { cout << name; }
};
class GGame1 : public Game {
public: GGame1() : Game("遊戲 1: 猜數字") {}
void start() override { cout << "歡迎進入猜數字遊戲!\n"; /* 遊戲邏輯 */ }
};
class GGame2 : public Game {
public: GGame2() : Game("遊戲 2: 石頭剪刀布") {}
void start() override { cout << "歡迎進入石頭剪刀布!\n"; }
};
class GGame3 : public Game {
public: GGame3() : Game("遊戲 3: 冒險島") {}
void start() override { cout << "歡迎進入冒險島!\n"; }
};
int main() {
// 使用 unique_ptr 自動管理記憶體
vector> games;
games.push_back(make_unique());
games.push_back(make_unique());
games.push_back(make_unique());
while (true) {
// 依訪問次數遞減排序
sort(games.begin(), games.end(),
[](const unique_ptr& a, const unique_ptr& b) {
return a->getVisitCount() > b->getVisitCount();
});
cout << "\n=== 遊戲平台 ===\n";
for (size_t i = 0; i < games.size(); ++i) {
cout << i + 1 << ". ";
games[i]->showName();
cout << " (訪問:" << games[i]->getVisitCount() << ")\n";
}
cout << "0. 離開\n選擇: ";
int choice;
if (!(cin >> choice) || choice == 0) break;
if (choice < 1 || choice > (int)games.size()) continue;
Game* g = games[choice - 1].get();
g->addVisit();
g->start();
cout << "遊戲結束,返回主選單。\n";
}
return 0; // unique_ptr 自動 delete
}
設計亮點
- 智慧指標:
unique_ptr 避免記憶體洩漏,符合 RAII。
- vector + sort:動態容器支援任意遊戲數量,排序邏輯集中。
- 多態呼叫:
g->start() 自動分派到正確衍生類。
- 擴充性:新增遊戲只需繼承
Game 並 push_back,主迴圈零修改。