Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何定义构造函数c++; 我只使用C++一年,我希望能更好地理解我当前项目中的抽象。我从我的书《开始C++》通过游戏编程制作了Black Jack牌游戏。游戏可以运行,但我正在使用一个菜单选项来重新启动游戏,添加分数,并允许您通过fstream查看分数_C++_Copy Constructor - Fatal编程技术网

如何定义构造函数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_游戏
    be
    Game m_Game=Game(vector())。这将在构造函数之前执行,这使您能够设置任何类成员的默认值。此解决方案的缺点是将调用复制构造函数(首先,将创建临时对象,然后将其复制到您的实例中,编译器可以对其进行优化,但并不总是这样;如果您不知道它是什么,请检查此项:)
  • 使用C++中的初始化列表。本主题中有一些关于堆栈溢出的问题,例如here()。在这个解决方案中,您不会创建任何时间对象(如第一个解决方案中)。您的构造函数如下所示:
    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我在回答中做了一些小改动(第一个和第三个选项是最好的,我添加了最后一段)