DaniWeb IT Discussion Community

DaniWeb IT Discussion Community (http://www.daniweb.com/forums/index.php)
-   C++ (http://www.daniweb.com/forums/forum8.html)
-   -   error C2677: binary '==' : no global operator found (http://www.daniweb.com/forums/thread131831.html)

QuantNeeds Jun 30th, 2008 3:35 am
error C2677: binary '==' : no global operator found
 
Hello,

I am working on two separate programs because I was trying one differently. I got my other program’s issue solved but now I would like to complete this one. But I am little lost on the error because the data it is complaining about is part of the class. I have included my header file code for verification.

The error is:
(126) : error C2677: binary '==' : no global operator found which takes type 'DiceGame:: Status' (or there is no acceptable conversion)

My header file:
// Craps class definition
class Dice
{
public:
        int rollDice();                                // function that rolls the dice and calculates the sum       
};
class DiceGame
{
public:
        void play();                                // function play controls the details of the game
        void chatter();
        static bool test();
private:       
        enum Status { CONTINUE, WON, LOST }; // enumeration with constants that represent the game status - all caps in constants
        int myPoint; // point if no win or loss on first roll
        Status gameStatus; // can contain CONTINUE, WON or LOST
};

class Wagering
{
public:
        static bool wageringTest(double, double);

};

My code is the following:
#include "Craps.h"                        // include definition of class Craps

// function that rolls the dice and calculates the sum       
int Dice::rollDice()
{
        // randomize random number generator using current time
        srand ( (unsigned)time ( 0 ) );       
       
        // pick random die values
        int die1 = 1 + rand() % 6; // first die roll
        int die2 = 1 + rand() % 6; // second die roll

        int sum = die1 + die2; // compute sum of die values

        // display results of this roll
        cout << "Player rolled " << die1 << " + " << die2 << " = " << sum << endl;
        return sum; // end function rollDice
} // end function rollDice

// function play will control the details of the game
void DiceGame::play()
{
        Dice rollDice;
        int sumOfDice = rollDice.rollDice(); // first roll of the dice

        // determine game status and point (if needed) based on first roll
        switch ( sumOfDice )
        {
                case 7: // win with 7 on first roll
                case 11: // win with 11 on first roll
                        gameStatus = WON;
                        break;
                case 2: // lose with 2 on first roll
                case 3: // lose with 3 on first roll
                case 12: // lose with 12 on first roll
                        gameStatus = LOST;
                        break;
                default: // did not win or lose, so remember point
                        gameStatus = CONTINUE; // game is not over
                        myPoint = sumOfDice; // remember the point
                        cout << "Point is " << myPoint << endl;
                        break; // optional at end of switch
        } // end switch

        // while game is not complete
        while ( gameStatus == CONTINUE ) // not WON or LOST
        {
                chatter();
                sumOfDice = rollDice.rollDice(); // roll dice again

          // determine game status
          if (sumOfDice == myPoint) // win by making point
                gameStatus = WON;
          else
          if (sumOfDice == 7) // lose by rolling 7 before point
            gameStatus = LOST;
} // end while
}
// chatter displays messages at random to create "chatter"
void DiceGame::chatter()
{
  // choose message at random
  switch ( rand() % 9 )
  {
      case 0:
        cout << "Oh, you're going for broke, huh?";
        break;
      case 1:
        cout << "Aw cmon, take a chance!";
        break;
      case 2:
        cout << "Hey, I think this guy is going to break the bank!!";
        break;
      case 3:
        cout << "You're up big. Now's the time to cash in your chips!";
        break;
      case 4:
        cout << "Way too lucky! Those dice have to be loaded!";
        break;
      case 5:
        cout << "Bet it all! Bet it all!";
        break;
      case 6:
        cout << "Can I borrow a chip?";
        break;
      case 7:
        cout << "Let's try our luck at another table.";
        break;
      case 8:
        cout << "You're a cheat! It is just a matter of time"
            << "\nbefore I catch you!!!";
        break;
  } // end switch

  cout << endl;
} // end function chatter

bool DiceGame::test()
{
  double wager = 100.00; // wager for current game
  double bankBalance = 1000.00; // current bank balance
  int games = 20;

  do
  {
          DiceGame roll; // create object
          roll.play();

          // display won or lost message
                if( gameStatus == WON )
                {
                        bankBalance += wager;
                        cout << "\nPlayer wins. Your new balance is $" << bankBalance << endl;
                }
                else
                {
                        bankBalance -= wager;

                        if(bankBalance <= 0)
                        {
                                cout << "\nSorry. You busted!\n";
                        }
                        else
                        {
                                cout << "\nPlayer loses. Your new balance is $" << bankBalance << endl;
                        }
                }

          //roll.displayMessage();
          roll.chatter();
          if(Wagering::wageringTest(wager, bankBalance))
          {
                  games--;
          }
          else
          {
                  games = 0;        // to terminate the loop and exit
                  cout << "Game over Wager or balance issue Game terminated.";
          }

  } while ( games > 0 );

        return true;
}
bool Wagering::wageringTest(double currentWager, double currentBankBalance)
{
        if (currentBankBalance >= 0)
        {
                if(currentWager <= currentBankBalance)
                {
                        return true;
                }       
                else
                {
                        return false;
                }
        }
        else
        {
                return false;
        }
}

Agni Jun 30th, 2008 3:44 am
Re: error C2677: binary '==' : no global operator found
 
Where is 'Status' defined?? .. Basically 'Status' is not a native Datatype of c++ and so it doesnt have a predefined '==' operator for it. So you need to overload the particular operator before you do something like Status == xxx.

Read more about the topic "Operator Overloading" and you will understand.

niek_e Jun 30th, 2008 3:44 am
Re: error C2677: binary '==' : no global operator found
 
Change line 141 from :
if( gameStatus == WON )

to:
if( roll.gameStatus == WON )

And your problem should be solved

Agni Jun 30th, 2008 3:46 am
Re: error C2677: binary '==' : no global operator found
 
OK my bad.. i didnt see that "Status" is declared right above in the class defintion and it's an Enum. Please ignore my post. Though you can still read about 'operator overloading' if you feel like.

sorry for the confusion

QuantNeeds Jun 30th, 2008 4:05 am
Re: error C2677: binary '==' : no global operator found
 
Quote:

Originally Posted by niek_e (Post 637277)
Change line 141 from :
if( gameStatus == WON )

to:
if( roll.gameStatus == WON )

And your problem should be solved

Thanks that worked but now I am having an issue with the random number generator. It seems like it's not working, because the dice results stay the same and the chatter comments also stays at the same case.

my code is:

// Exercise 6.54 Solution: Craps.cpp - Craps simulation with wagering and chatter
// Member-function definitions for Craps

// allows program to perform input and output; the program uses the following
#include <iostream>
using std::cout;
using std::cin;
using std::endl;

#include <cstdlib> // contains prototypes for functions srand and rand
using std::rand;
using std::srand;

#include <ctime> // contains prototype for function time
using std::time;     

#include "Craps.h"                        // include definition of class Craps

Dice::Dice()
{
        // randomize random number generator using current time
        srand ( (unsigned)time ( 0 ) );        // initialize the random number generator
}
// function that rolls the dice and calculates the sum       
int Dice::rollDice()
{
        //Dice();

        int die1 = 1 + rand() % 6; // first die roll
        int die2 = 1 + rand() % 6; // second die roll

        int sum = die1 + die2; // compute sum of die values

        // display results of this roll
        cout << "Player rolled " << die1 << " + " << die2 << " = " << sum << endl;
        return sum; // end function rollDice
} // end function rollDice

// function play will control the details of the game
void DiceGame::play()
{
        Dice rollDice;
        int sumOfDice = rollDice.rollDice(); // first roll of the dice

        // determine game status and point (if needed) based on first roll
        switch ( sumOfDice )
        {
                case 7: // win with 7 on first roll
                case 11: // win with 11 on first roll
                        gameStatus = WON;
                        break;
                case 2: // lose with 2 on first roll
                case 3: // lose with 3 on first roll
                case 12: // lose with 12 on first roll
                        gameStatus = LOST;
                        break;
                default: // did not win or lose, so remember point
                        gameStatus = CONTINUE; // game is not over
                        myPoint = sumOfDice; // remember the point
                        cout << "Point is " << myPoint << endl;
                        break; // optional at end of switch
        } // end switch

        // while game is not complete
        while ( gameStatus == CONTINUE ) // not WON or LOST
        {
                chatter();
                sumOfDice = rollDice.rollDice(); // roll dice again

          // determine game status
          if (sumOfDice == myPoint) // win by making point
                gameStatus = WON;
          else
          if (sumOfDice == 7) // lose by rolling 7 before point
            gameStatus = LOST;
} // end while
}
// chatter displays messages at random to create "chatter"
void DiceGame::chatter()
{
  // choose message at random
  switch ( rand() % 9 )
  {
      case 0:
        cout << "Oh, you're going for broke, huh?";
        break;
      case 1:
        cout << "Aw cmon, take a chance!";
        break;
      case 2:
        cout << "Hey, I think this guy is going to break the bank!!";
        break;
      case 3:
        cout << "You're up big. Now's the time to cash in your chips!";
        break;
      case 4:
        cout << "Way too lucky! Those dice have to be loaded!";
        break;
      case 5:
        cout << "Bet it all! Bet it all!";
        break;
      case 6:
        cout << "Can I borrow a chip?";
        break;
      case 7:
        cout << "Let's try our luck at another table.";
        break;
      case 8:
        cout << "You're a cheat! It is just a matter of time before I catch you!!!";
        break;
  } // end switch

  cout << endl;
} // end function chatter

bool DiceGame::test()
{
  double wager = 100.00; // wager for current game
  double bankBalance = 1000.00; // current bank balance
  int games = 20;

  cout << "\nYou have $" << bankBalance << " in the bank.\n";
 
  do
  {
          DiceGame roll; // create object
          roll.play();

          // display won or lost message
                if( roll.gameStatus == WON )
                {
                        bankBalance += wager;
                        cout << "\nPlayer wins. Your new balance is $" << bankBalance << endl;
                }
                else
                {
                        bankBalance -= wager;

                        if(bankBalance <= 0)
                        {
                                cout << "\nSorry. You busted!\n";
                        }
                        else
                        {
                                cout << "\nPlayer loses. Your new balance is $" << bankBalance << endl;
                        }
                }

          //roll.displayMessage();
          roll.chatter();
          if(Wagering::wageringTest(wager, bankBalance))
          {
                  games--;
          }
          else
          {
                  games = 0;        // to terminate the loop and exit
                  cout << "Game over Wager or balance issue Game terminated.";
          }

  } while ( games > 0 );

        return true;
}
bool Wagering::wageringTest(double currentWager, double currentBankBalance)
{
        if (currentBankBalance >= 0)
        {
                if(currentWager <= currentBankBalance)
                {
                        return true;
                }       
                else
                {
                        return false;
                }
        }
        else
        {
                return false;
        }
}

niek_e Jun 30th, 2008 4:17 am
Re: error C2677: binary '==' : no global operator found
 
This:
srand ( (unsigned)time ( 0 ) );
should be in main() as on of the first lines, not in the constructor.

QuantNeeds Jun 30th, 2008 4:52 am
Re: error C2677: binary '==' : no global operator found
 
Quote:

Originally Posted by niek_e (Post 637296)
This:
srand ( (unsigned)time ( 0 ) );
should be in main() as on of the first lines, not in the constructor.


thank you :)


All times are GMT -4. The time now is 6:50 am.

Forum system based on vBulletin Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
©2003 - 2009 DaniWeb® LLC