簡體   English   中英

為什么我的對象聲明不調用默認構造函數?

[英]Why doesn't my object declaration call the default constructor?

這是我第一次嘗試將類聲明正確地分離到頭文件管理器中,並將它們的實現正確地分離到 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;
};

我希望牌組和 Shuffled 牌組變量填充 Card 對象,但兩者都沒有。

原因是在您的頭文件中,您在函數上打開了花括號。 編譯器認為這是一個完整的函數,不需要轉到您實際完成實現的 .cpp 文件。 為了更正此問題,請從以下位置重寫標題中的函數:

Deck()
    {
    }

到:

Deck();

這適用於頭文件中的所有函數。 執行此操作后,將調用默認構造函數。

同樣在您的 .cpp 文件中,您不應再次創建 Deck 類。 取而代之的是,您應該使用類的名稱和一元作用域運算符。 我會給你一個默認構造函數的例子:

你應該在你的 .cpp 中有這個:

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

代替

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM