1

I am trying to access a member of one class in another class. I am fairly new to C++ so forgive me if this is an easy fix but I cannot find the answer, so I came here.

In this instance I would like to call "init();" from class CGuessNumber and member CheckNumber.

Here is my code.

#include <iostream>
#include <ctime>
#include <cstdlib>

class CGuessNumber
{
public:
    int GenerateNumber()
    {
        return rand() % 100 + 1;
    }

    void checkNumber(int guess, int answer, int &attempts)
{

    if (guess < answer)
    {
        std::cout << "TOO LOW, TRY AGAIN"  << "\n" << "TRYS LEFT: " << attempts  << "\n";
        attempts--;
    }else if(guess > answer)
    {
        std::cout << "TOO HIGH, TRY AGAIN"  << "\n" << "TRYS LEFT: " << attempts  << "\n";
        attempts--;
    }else if(guess ==  answer)
    {
        std::cout << "YOU WON!"  << "\n" << "TRYS LEFT: " << attempts  << "\n";
    }

    if (attempts <= 0)
    {
        std::cout << "YOU LOST!"  << "\n" << "TRYS LEFT: " << attempts  << "\n";
        CGAME::init(answer, attempts);
    }

}
}Number;

class CGAME
{
public:
        void init(int &answer, int &attempts)
    {
        answer = Number.GenerateNumber();
        attempts = 5;
    };

    int newGame()
    {
        srand (time(NULL));
        int intAnswer, playerGuess, trys;

        init(intAnswer, trys);

        while(intAnswer != playerGuess and trys > 0)
        {
            std::cin >> playerGuess;

            Number.checkNumber(playerGuess, intAnswer, trys);
        }
    };
}ONewGame;

int main()
{
    CGAME ONewGame
    ONewGame.newGame();

    return 0;
}
Matt Hirdler
  • 95
  • 1
  • 10

2 Answers2

3

I think, this is what you're looking for

Basically you can pass a pointer which points to one object into a constructor of the other. In this case we just pass a pointer to CGuessNumber into the CGAME constructor, we also store this pointer in a private field so we can use it. Then you can use this pointer to call methods.

working example (pointer->method syntax)

working example (reference.method syntax)

#include <iostream>
#include <ctime>
#include <cstdlib>

class CGuessNumber
{
public:

    int GenerateNumber()
    {
        return rand() % 100 + 1;
    }

void checkNumber(int guess, int answer, int &attempts)
{

    if (guess < answer)
    {
        std::cout << "TOO LOW, TRY AGAIN"  << "\n" << "TRYS LEFT: " << attempts  << "\n";
        attempts--;
    }else if(guess > answer)
    {
        std::cout << "TOO HIGH, TRY AGAIN"  << "\n" << "TRYS LEFT: " << attempts  << "\n";
        attempts--;
    }else if(guess ==  answer)
    {
        std::cout << "YOU WON!"  << "\n" << "TRYS LEFT: " << attempts  << "\n";
    }

    if (attempts <= 0)
    {
        std::cout << "YOU LOST!"  << "\n" << "TRYS LEFT: " << attempts  << "\n";
    }
}
};

class CGAME
{
public:

    CGAME(CGuessNumber* pNumber)
    {
        m_number = pNumber;
    }
    void init(int &answer, int &attempts)
    {
        answer = m_number->GenerateNumber();
        attempts = 5;
    };

    void newGame()
    {
        srand (time(NULL));
        int intAnswer, playerGuess, trys;

        init(intAnswer, trys);

        while(intAnswer != playerGuess and trys > 0)
        {
            std::cin >> playerGuess;

            m_number->checkNumber(playerGuess, intAnswer, trys);
        }
    };

    private:
        CGuessNumber* m_number;
};

int main()
{
    CGuessNumber* pGnum = new CGuessNumber();
    CGAME* ONewGame = new CGAME(pGnum);
    ONewGame->newGame();
    return 0;
}
1

Let me just address the syntax errors.

In the checkNumber() function:

...
CGAME::init(answer, attempts);
...

There are 2 problems with this:

  1. CGAME is not declared yet, so the compiler doesn't know it exists, or what it is. To avoid this, usually all the classes are declared at the top (or in a header file) and all there functions are defined later.

  2. You can't call a member function of a class without an object, unless it's a static function. This function can be static as it doesn't use member variables (there are design issues, but lets ignore them for now).

Also in main() you missed a ';', but I think you already know that :-)

So, applying these changes:

#include <iostream>
#include <ctime>
#include <cstdlib>

// only declaring the classes here
class CGAME
{
public:
    static void init(int &answer, int &attempts);
    int newGame();
}ONewGame;

class CGuessNumber
{
public:
    int GenerateNumber();
    void checkNumber(int guess, int answer, int &attempts);
}Number;

// defining all the class member functions now
int CGAME::newGame()
{
    srand (time(NULL));
    int intAnswer, playerGuess, trys;

    init(intAnswer, trys);

    while(intAnswer != playerGuess and trys > 0)
    {
        std::cin >> playerGuess;

        Number.checkNumber(playerGuess, intAnswer, trys);
    }
}

int CGuessNumber::GenerateNumber()
{
    return rand() % 100 + 1;
}

void CGuessNumber::checkNumber(int guess, int answer, int &attempts)
{
    if (guess < answer)
    {
        std::cout << "TOO LOW, TRY AGAIN"  << "\n" << "TRYS LEFT: " << attempts  << "\n";
        attempts--;
    }else if(guess > answer)
    {
        std::cout << "TOO HIGH, TRY AGAIN"  << "\n" << "TRYS LEFT: " << attempts  << "\n";
        attempts--;
    }else if(guess ==  answer)
    {
        std::cout << "YOU WON!"  << "\n" << "TRYS LEFT: " << attempts  << "\n";
    }

    if (attempts <= 0)
    {
        std::cout << "YOU LOST!"  << "\n" << "TRYS LEFT: " << attempts  << "\n";
        CGAME::init(answer, attempts);
    }
}

void CGAME::init(int &answer, int &attempts)
{
    answer = Number.GenerateNumber();
    attempts = 5;
}

int main()
{
    CGAME ONewGame;
    ONewGame.newGame();

    return 0;
}
lalli
  • 6,083
  • 7
  • 42
  • 55
  • If this is not appropriate to ask on here, let me know please but, what are the design issues you mention. I am still learning and that is a large part of what I am trying to learn. – Matt Hirdler Nov 12 '13 at 06:52
  • the global objects for one. Tight coupling between the classes. And the classes are not really using encapsulation. Andrew's implementation (the other answer) is really good actually and solves many things. – lalli Nov 12 '13 at 07:06