为什么我的对象声明不调用默认构造函数?

时间:2019-12-06 00:05:44

标签: c++ object

这是我第一次尝试将类声明适当地分离到头文件管理器中,并将其实现分离到cpp文件中,但我不确定出什么问题了。我正在尝试在main()中创建一个Deck对象,我假设它将从cpp文件中调用我的默认构造函数,但没有任何反应。我的断点显示该对象是由其完全没有默认构造函数中任何内容的对象创建的。实际上,我在默认构造函数中设置的断点表示我的当前代码无法到达它们。感谢您的帮助!

#include <iostream>
#include "Deck.h"
#include "Dealer.h"
#include "GameManager.h"
#include"Player.h"
#include "Card.h"



int main()
{
    Deck blackJackDeck;
    blackJackDeck.showDeck();
    Dealer blackJackDealer(blackJackDeck);
    Player blackJackPlayer;


    GameManager blackJackManager(blackJackPlayer, blackJackDealer);
    blackJackManager.setUpGame();
    std::cout << "ready?";
};

我相信我的代码正在创建一个名为blackJackDeck的牌组对象,它将调用其默认构造函数。头文件在下面。

#pragma once
#include "Card.h"
#include "Node.h"
#include <vector>
#include <stack>

class Deck
{
public:
    Deck()
    {

    }
    void showDeck()
    {

    }

    void addCard(Card newCard)
    {

    }

    void print()
    {

    }

    void removeCard()
    {

    }

    Card popCard()
    {

    }

    void peekTop()
    {

    }

    bool isEmpty()
    {

    }


private:
    std::stack<Card, std::vector<Card>> shuffledDeck;
    std::vector<Card> deck;

};

cpp的实现如下

#include "Card.h"
#include "Node.h"
#include  <vector>
#include <stack>
#include <algorithm>
#include <random>
#include <time.h>


class Deck
{
public:
    Deck()
    {
        std::default_random_engine randomEngine{ std::random_device{}() };

        Card wild(1, 2);

        for (int i = 1; i <= 4; i++)
        {
            for (int j = 1; j <= 13; j++)
            {
                deck.push_back(wild);           
            }
        }

        std::cout << "test";

        std::shuffle(deck.begin(), deck.end(), randomEngine);

        for (Card k : deck)
        {
            shuffledDeck.push(k);
        }
    }

    void showDeck()
    {
        for (Card i : deck)
        {
            i.fullCard();
        }
    }


    void addCard(Card newCard)
    {
        shuffledDeck.push(newCard);
    }

    void print()
    {
        //todo
    }

    void removeCard()
    {
        //todo
    }

    Card popCard()
    {
        shuffledDeck.pop();
    }

    void peekTop()
    {
        shuffledDeck.top();
    }

    bool isEmpty()
    {
        if (shuffledDeck.size() == 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }


private:
    std::stack<Card, std::vector<Card>> shuffledDeck;
    std::vector<Card> deck;
};

我希望卡片组和随机播放的卡片组变量将填充Card对象,但它们中都没有任何东西。

1 个答案:

答案 0 :(得分:2)

原因是在头文件中,您打开了函数的花括号。编译器认为这是一个完整的功能,不需要转到实际完成实现的.cpp文件。为了纠正此问题,请从以下位置重写标头中的函数:

Deck()
    {
    }

收件人:

Deck();

这适用于头文件中的所有功能。完成此操作后,将调用默认构造函数。

此外,在您的.cpp文件中,您不应该再制作Deck类。代替此,您应该使用类的名称和一元作用域运算符。我将使用默认构造函数为您提供示例:

您应该只在您的.cpp文件中添加它:

Deck::Deck()
{
   // code goes here
}

代替

class Deck
{
public:
   Deck()
   {
      // code goes here
   }
}