C++ C++;对象成员整数的值(WTF)

C++ C++;对象成员整数的值(WTF),c++,class,object,C++,Class,Object,这是一个扑克游戏,我在PokerTable.h中定义了类PokerTable #include <iostream> using namespace std; class PokerTable { private: int numPlayers; int numPlaying; int dealerPos; int bigBlind; int potSize; int betSize; bool flop; bool turn; bool river; publ

这是一个扑克游戏,我在PokerTable.h中定义了类PokerTable

#include <iostream>
using namespace std;
class PokerTable
{
private:
 int numPlayers;
 int numPlaying;
 int dealerPos;
 int bigBlind;
 int potSize;
 int betSize;
 bool flop;
 bool turn;
 bool river;

 public:
 //constructors
 PokerTable();
 PokerTable(int,int,int,int,int,bool,bool,bool);

 //getters
 int getNumPlayers(){return numPlayers;};
 int getDealerPos(){return dealerPos;};
 int getBigBlind(){return bigBlind;};
 int getNumPlaying(){return numPlaying;};
 int getPotSize(){return potSize;};
 int getBetSize(){return betSize;};
 bool getFlop(){return flop;};
 bool getTurn(){return turn;};
 bool getRiver(){return river;};
 //void buttonShow(int);


 //setters
 void setBetSize(int inBetSize){betSize = inBetSize;};
 void setBigBlind(int inBigBlind){bigBlind = inBigBlind;};
 void setNumPlaying(int inNumPlaying){numPlaying = inNumPlaying;};
 void setPotSize(int inPotSize){potSize = inPotSize;};
 void setFlop(bool inFlop){flop = inFlop;};
 void setTurn(bool inTurn){turn = inTurn;};
 void setRiver(bool inRiver){river = inRiver;};
 void setNumPlayers(int inPlayers){numPlayers = inPlayers;};
 void setDealerPos(int inDealerPos){dealerPos = inDealerPos;};
};
PokerTable::PokerTable()
{
 numPlayers = 9;
 numPlaying = 9;
 dealerPos = 1;
 bigBlind = 20;
 flop = false;
 turn = false;
 river = false;
}
PokerTable::PokerTable(int playerNum, int playingCount, int posDealer, int blindBig,int inPotSize, bool inFlop,bool inTurn,bool inRiver)
{
 numPlayers = playerNum;
 numPlaying = playingCount;
 dealerPos = posDealer;
 potSize = inPotSize;
 bigBlind = blindBig;
 flop = inFlop;
 turn = inTurn;
 river = inRiver;
}
之后,我的观察名单上有一张扑克桌:

-       aPokerTable { numPlayers=2990892 numPlaying=9 dealerPos=9 ...}  PokerTable
        betSize 30  int
        bigBlind    1   int
        dealerPos   9   int
        flop    false   bool
        numPlayers  2990892 int
        numPlaying  9   int
        potSize 20  int
        river   false   bool
        turn    false   bool
谁能告诉我为什么所有的值都不是我声明的值??!?!! 我怎样才能解决这个问题

这是Form1.h

#pragma once
#include "PokerTable.h"
#include "Card.h"
#include <time.h>
#include "PokerPlayer.h"
#include <fstream>
#include <string>
#include <sstream>

//global variables
//TODO make players start from 0
int firstPlayer;
int deck[52];
int nextCard=0;
PokerTable aPokerTable(9,9,1,20,30,false,false,false);
PokerPlayer players[9]; //however many players
ofstream gameLog;
/*
void setTable()
{
    aPokerTable.setNumPlayers(9);
    aPokerTable.setNumPlaying(9);
    aPokerTable.setDealerPos(1);
    aPokerTable.setBigBlind(20);
    aPokerTable.setPotSize(30);
    aPokerTable.setBetSize(20);
    aPokerTable.setFlop(false);
    aPokerTable.setTurn(false);
    aPokerTable.setRiver(false);

}
*/
string convertInt(int number) //convert to string
{
   stringstream ss;//create a stringstream
   ss << number;//add number to the stream
   return ss.str();//return a string with the contents of the stream
}

void createPlayers()
{
//  aPokerTable.setNumPlayers(9);
    for(int x=0;x<=(aPokerTable.getNumPlayers()-1);x++)
    {
        players[x] = *(new PokerPlayer(1000,(aPokerTable.getDealerPos())+1,false,0,1));//1000 chips, position i+1, not folded
    }
}



void playRound()
{
    int action;
    for(int playerTurn = firstPlayer; playerTurn <= aPokerTable.getNumPlayers()+firstPlayer;  playerTurn++)
    {
        if(players[playerTurn].getFold() == false)
        {
            if(aPokerTable.getNumPlaying() == 1)
            {
                players[playerTurn].setChipStack(players[playerTurn].getChipStack() + aPokerTable.getPotSize()); //player wins pot
            }
            else //there is more than one person playing
                {
                action = players[playerTurn].action(); //0 is check/fold, value is call/bet/raise,
                if(action > aPokerTable.getBetSize())
                {
                    aPokerTable.setBetSize(action);
                    aPokerTable.setPotSize(aPokerTable.getPotSize() + action);
                    playerTurn = playerTurn - aPokerTable.getNumPlayers();
                }
                else if (action == aPokerTable.getBetSize()) //call
                {
                    aPokerTable.setPotSize(aPokerTable.getPotSize() + action);
                }
                else //action < aPokerTable.betSize
                {
                    players[playerTurn].setFold(true);
                    aPokerTable.setNumPlaying(aPokerTable.getNumPlaying()-1); //removes player from playing tally
                }
            }
        }
    }
}


void randomDeck()
{
    int random_integer;
    int tempCard;
    //srand((unsigned)time(0));
    for(int j=0;j<=51;j++)
    {
        deck[j] = j;
    } 

    for(int i=51; i>=1; i--)
    {
        random_integer = rand()%(i); //a random number between 0 and i
        tempCard = deck[i];
        deck[i] = deck[random_integer]; //put the random card from unshuffled deck into slot i of the deck
        deck[random_integer] = tempCard; //put whatever was at slot i into the random slot
    }

}

void dealCards()
{
    for(int j=1;j<=aPokerTable.getNumPlayers();j++)
    { 
        players[j].setCard1(deck[nextCard]);
        nextCard++;
        players[j].setCard2(deck[nextCard]);
        nextCard++;
    }
}

void playPreFlop()
{
    aPokerTable.setBetSize(aPokerTable.getBigBlind());
    aPokerTable.setFlop(false); //it is before the flop
    aPokerTable.setTurn(false);
    aPokerTable.setRiver(false);
    randomDeck(); //shuffle cards
    dealCards();
    firstPlayer = (aPokerTable.getDealerPos() + 3)%(aPokerTable.getNumPlayers()); // first player is left of blinds between 0 and numplayers
    playRound();
}


void playFlop()
{
    aPokerTable.setFlop(true);
    firstPlayer = (aPokerTable.getDealerPos())%aPokerTable.getNumPlayers(); // first player is left of dealer between 0 and numplayers
    aPokerTable.setBetSize(0);
    playRound();
}
void playTurn()
{
    aPokerTable.setTurn(true);
    firstPlayer = (aPokerTable.getDealerPos())%aPokerTable.getNumPlayers(); // first player is left of dealer between 0 and numplayers
    aPokerTable.setBetSize(0);
    playRound();
}
void playRiver()
{
    aPokerTable.setRiver(true);
    firstPlayer = (aPokerTable.getDealerPos())%(aPokerTable.getNumPlayers()); // first player is left of dealer between 0 and numplayers
    aPokerTable.setBetSize(0);
    playRound();
    if(aPokerTable.getNumPlaying() >=2)
        {
        //showDown();
        }
}
/*
void showDown()
{

}
*/

这是因为在C++调用构造函数之前,变量使用它在内存位置中已经包含的值,它是一个“随机”值

,因为它没有完整的代码,所以我不能重建它。然而,一个接近400万的随机值听起来像一个指针。存储或检索成员变量时,可能没有反引用指针。请张贴代码的其余部分,以便我们可以检查是否是这种情况

players[x]=*(新扑克玩家(…)

这是内存泄漏。您可能想要的是:

players[x] = PokerPlayer(1000,(aPokerTable.getDealerPos())+1,false,0,1);
aPokerTable{numPlayers=2990892 numPlaying=9经销商=9…}

注意,DealPerpos被赋值为9,这也是错误的。如果仔细观察,您会发现所有内容都被移位了4个字节


两个可能的原因。调试器可能为aPokerTable选择了错误的地址,实际地址减去4。那不太可能。或者PokerTable.cpp看到的PokerTable类的定义与其他包含PokerTable.h include文件的.cpp文件不匹配。其中pokertable.cpp在numPlayers成员之前看到了一个额外的成员。也许您编辑了标题并删除了该成员,但由于某种神秘的原因没有重新编译pokertable.cpp。构建+重建以修复。如果这真的有效,一定要惊慌一点

也许这只是一个调试器问题?当您手动打印这些值时会发生什么情况?您需要向我们显示代码中存在bug的部分。您需要认真考虑如何命名您的成员和参数。@Daupich他正在调用设置9个参数的构造函数。@David Heffernan,它只设置8个变量,尽管总共有9个;一个int未初始化。然而,他说的并不是错的。这里有些奇怪。<代码>玩家[X] = *(新的PokPosiple)……<代码>:这不是理智的C++。我相信你在用java思考,在驱动代码中犯了一些类似的错误(我猜它在<代码>主< /代码>函数这里).你能发布那些部分吗?你到底在哪里停止了调试器?@David:不,他们当然没有。@Max我编译并调试了你的代码,直到
PokerTable之后(9,9,1,20,30,false,false,false)
并且所有参数都已正确分配,除了betSize。这是有意义的,因为您没有通过构造函数对其进行初始化。您确定在构造后立即读取变量的值吗?如果是,则使用哪种编译器?可能是编译器或debugger@Max我自己用VS2010调试的icrosoft VS我真的非常怀疑这是编译器问题。不知道抱歉!@David He说他调试并读取值,直到
PokerTable(9,9,1,20,30,false,false)之后
有趣的值出现在前一行代码之后。我在编译器中复制并粘贴了相同的代码,它给出了预期的结果。知道没有其他线程,还有什么其他事情会影响这些值?有许多开源编译器可能有错误,你不怀疑吗?或者我应该闭嘴吗这种可能性是因为你的先生可能会认为这很疯狂吗?我在这里呆了很短时间,但是男人有很大的自尊心。here@Max我不认为微软的VC++是这样的。考虑到你在文章中提到的,它应该能正常工作。我们根本不知道这就是为什么我们要打架:))谢谢。我对此进行了修改,以消除正确的操作数错误的数据类型错误。我认为主要的问题是我不知道C++如何充分地去引用指针?我认为使用构造函数会自动反引用变量。不是说构造函数,而是说你的打印方法在4字节的移位中表现出色。没有PokerTable.cpp,只有PokerTable.h,它包含在表1.h中。我已经重建了,但没有任何帮助,在numPlayers之前,我似乎找不到额外的成员。我应该创建一个PokerTable.cpp文件吗?不,我不知道是什么导致了偏移。如果希望有人查看项目,请将其复制到文件共享服务。
using namespace std;
    class PokerPlayer
    {
    private:
        int chipStack,position;
        bool fold;
        int card1,card2;
    public:
        //constructors
        PokerPlayer();
        PokerPlayer(int,int,bool,int,int);

        //getters
        int getChipStack() {return chipStack;}
        int getPosition() {return position;}
        int getCard1(){return card1;}
        int getCard2(){return card2;}
        bool getFold(){return fold;}

        //setters
        void setChipStack(int inChips){chipStack = inChips;}
        void setPosition(int inPos){position = inPos;}
        void setCard1(int inCard1){card1 = inCard1;}
        void setCard2(int inCard2){card2 = inCard2;}
        void setFold(bool inFold){fold = inFold;}

        int action();
    };

    PokerPlayer::PokerPlayer()
    {
        chipStack = 1000;
        position = 0;
        fold=false;
        card1 = 0;
        card2 = 1;
    }
    PokerPlayer::PokerPlayer(int inChipStack,int inPos, bool inFold, int inCard1, int inCard2)
    {
        chipStack = inChipStack;
        position = inPos;
        fold = inFold;
        card1 = inCard1;
        card2 = inCard2;
    }
    int PokerPlayer::action()
    {
        return 0;
    }
players[x] = PokerPlayer(1000,(aPokerTable.getDealerPos())+1,false,0,1);