如何定义构造函数c++; 我只使用C++一年,我希望能更好地理解我当前项目中的抽象。我从我的书《开始C++》通过游戏编程制作了Black Jack牌游戏。游戏可以运行,但我正在使用一个菜单选项来重新启动游戏,添加分数,并允许您通过fstream查看分数
这是从基类游戏继承下来的菜单部分的外观:如何定义构造函数c++; 我只使用C++一年,我希望能更好地理解我当前项目中的抽象。我从我的书《开始C++》通过游戏编程制作了Black Jack牌游戏。游戏可以运行,但我正在使用一个菜单选项来重新启动游戏,添加分数,并允许您通过fstream查看分数,c++,copy-constructor,C++,Copy Constructor,这是从基类游戏继承下来的菜单部分的外观: class Menu { public: Menu(); ~Menu(); private: Game m_game; //saves scores to fstream from class Player m_player; //menu options void choice(); }; Menu::Menu() {} //no appropriate default constructor
class Menu
{
public:
Menu();
~Menu();
private:
Game m_game;
//saves scores to fstream from class Player m_player;
//menu options
void choice();
};
Menu::Menu() {} //no appropriate default constructor available for Game
Menu::~Menu() {}
void Menu::choice()
{
char respond;
bool run = true;
cout << "Would you like to [R]estart the game, [A]dd new score, [V]iew the score sheet or [Q]uit?" << endl;
cin >> respond;
switch (respond)
{
case 'R': m_game.play(); break;
case 'A': //add new score to fstream
case 'V': //view score txt file
case 'Q': run = false; break;
}
}
类菜单
{
公众:
菜单();
~Menu();
私人:
游戏m_游戏;
//将等级玩家m_玩家的分数保存到fstream;
//菜单选项
无效选择();
};
Menu::Menu(){}//游戏中没有合适的默认构造函数
菜单::~Menu(){}
void菜单::choice()
{
字符响应;
bool run=true;
反应迟钝;
开关(响应)
{
案例“R”:m_game.play();break;
案例“A”://向fstream添加新分数
案例“V”://查看分数txt文件
案例“Q”:run=false;break;
}
}
我对如何为本节创建默认构造函数感到非常困惑,即使使用本书中的示例也是如此
Game类的构造函数如下所示:
class Game
{
public:
Game(const vector<string>& names);
~Game();
//plays game
void play();
private:
Deck m_deck;
House m_house;
vector<Player> m_players;
};
类游戏
{
公众:
游戏(常量向量和名称);
~Game();
//玩游戏
无效播放();
私人:
甲板m_甲板;
穆豪斯酒店;
向量m_播放器;
};
我希望得到一个解释或例子。谢谢你的帮助 您的菜单类(在调用构造函数之前)希望使用默认构造函数(不带参数)创建游戏实例,但游戏类没有默认构造函数(因为如果您创建任何构造函数,默认构造函数不会自动创建)
您有三种选择:
游戏m_游戏
beGame m_Game=Game(vector())代码>。这将在构造函数之前执行,这使您能够设置任何类成员的默认值。此解决方案的缺点是将调用复制构造函数(首先,将创建临时对象,然后将其复制到您的实例中,编译器可以对其进行优化,但并不总是这样;如果您不知道它是什么,请检查此项:)
Menu::Menu():m_游戏(vector()){}
第一个和第三个选项是最好的。你必须决定使用哪一个
当然,您可以用非空向量替换vector()
您还应该看看这里:。这里解释了初始化列表的所有内容
这里的另一个问题是,您不应该在Menu类中创建游戏实例(这是一个架构错误)。例如,您可以向choice()方法或菜单类构造函数传递指针或引用,并只存储游戏实例地址(如果游戏实例将由多个方法使用,则使用后者)。更合适的方法是游戏包含一个菜单实例。您可能需要更改标题。你的问题不是关于“抽象类”(这个术语在C++中有非常明确的含义,而且你所显示的类都不是抽象的)。您的问题实际上是关于如何定义类的构造函数,以便它初始化该类的成员。在您的情况下,
Menu
的构造函数可以简单地使用初始化器列表来显式初始化成员(例如,Menu::Menu():m_game(一些字符串的向量){}
((建议初始化构造函数初始化器列表中Menu
的所有成员,但这取决于您)提示:尝试将变量放在必要的范围内,不要无缘无故地将它们放入类中。respond
似乎只与响应函数相关,将其设置为局部变量。顺便问一下,if(respond==r)是什么
应该做什么?r
似乎没有初始化,与'r'
字母不同。这些变量看起来与菜单项相关,但它们甚至不是必需的。提示:在您的输入上使用开关
。谢谢,我将使用我最初使用的开关进行编辑。至于初始设置对于构造函数列表,我仍然不确定如何正确初始化成员列表。我尝试添加const vector&name
,vector&name
,只添加name
,但它仍然抛出错误。当我以成员身份调用“Deck”和“House”时,我不明白它在游戏类中是如何工作的在游戏构造函数中对它们进行优化,但当我尝试使用相同的实现访问“游戏”时,它会声明“没有构造函数实例与参数列表匹配”。这是否回答了您的问题?这解决了问题!非常感谢!@winterx0我在回答中做了一些小改动(第一个和第三个选项是最好的,我添加了最后一段)