函数调用后,初始化变量会丢失值

IAE*_*IAE 4 c++ class function

问题说明了一切,真的.我不确定问题是什么.我对班级很新; 我与他们的实践经验接近于nill,但我已经阅读了相当多的关于他们的内容.

我用以下构造函数创建了一个类ECard

ECard::ECard( int bankNum, int PIN )
{
    m_BankNum     = new int;
    m_PIN         = new int;
    m_Barred      = new bool;
    m_Amount      = new double;

    *m_BankNum     = bankNum;
    *m_PIN         = PIN;
    *m_Barred      = false;
    *m_Amount      = 100.0;
}
Run Code Online (Sandbox Code Playgroud)

我初始化 EC card( 12345, 54321 )

我还有一个成员函数display(),它只打印出所有成员变量BankNum,PIN,Barred和Amount.

当我在我的main函数中调用此函数card.display()时,输出完全符合我的预期.

但是,当它进入我的循环时:

/* Fine values! */
card.display();
while( true )
{
    /* Introductory screen giving user options to choose from */
    mainScreen( card );
    /* Make a choice... */
    choice = readInput();
    /* Garbage! */
    card.display();
    /* Pass it to the switch, watch out for invalid input! doChoice is a bool */
    if( !doChoice( choice, card ) )
    {
        cout << "Bad input- repeat!" << endl;
    }
    /* TODO: Option to terminate loop. */
}
Run Code Online (Sandbox Code Playgroud)

我尝试在我的doChoice()函数中打印变量,我得到了垃圾.我的所有变量都搞砸了设置.我的Banknumber是一个东西,PIN是一个非常大的负数(不是MIN),Barred突然设置为true,并且我的帐户中有0个钱,即使Barred和Amount在构造函数之外的任何地方都没有明确设置.

/* Outsourced switch that handles the user input from MAIN */
bool doChoice( int choice, ECard card )
{
    int inputPIN;
    int inputAmount;

    /* Garbage! */
    card.display();

    switch( choice )
    {
    case 1:
    /* Case 1: Charge card with money. Needs PIN and amount */
        cout << "PIN Eingeben:  ";
        inputPIN    = readInput();
        cout << "\nBetrag Eingeben:  ";
        inputAmount = readInput();

        karte.aufladen( inputAmount, inputPIN );

        return true;
Run Code Online (Sandbox Code Playgroud)

如果某些成员函数和输出仍然是德语,我很抱歉.无论如何它都不应该是重要的(因为我可能会为国际公司编程,但我喜欢用英语编写所有的作业,但是如果我超出他的预期,我的老师非常挑剔并降低我的成绩)

变量在进入开关之前已经搞砸了,所以这部分应该只是修辞.我只能看到卡片对象的传递问题,但我不知道为什么会出现问题.我不知道如何修复它,我只是发送每个成员吗?创建一个指向该对象的指针并发送它?我的意思是,我之前传递了卡片对象,而其他功能并没有给我垃圾.只有这一个.

最后一点,如果语法中突然出现错误,那就是因为我很快将我的所有函数和成员翻译成英语,我可能错过了某个地方的资本化或诸如此类的东西.请忽略这些,语法正确并且程序运行,它只显示垃圾值.

Kat*_*ory 6

你是按价值传递卡.但是因为你有很多指针,并且可能没有编写复制构造函数,所以卡的副本使用指针来改变主循环中"旧"卡也在使用的内存.然后当函数退出时,可能你有一个卡析构函数删除所有成员变量?所以你基本上有悬空指针.如果没有ECard的所有代码,我无法确定,但这是我的猜测.

卡片中我没有指针.我认为int*在那里没有任何好处.然后,因为你想让doChoice更换卡片,所以它需要一个ECard,所以它可以改变你在主要使用的真实卡片.