Trevor Johnson
Trevor Johnson

Reputation: 57

Trying to access variables from another class

Im having an issue getting my variable from my original class to print in another class method Quick example of my issue:

say the variable was declared here in the test.h file:

class player{
private:
int x = 10;
void setX(); //method for setting X from user input
int getX(); //Method for retrieving variable
}

Then in another class method where i want to print X

 class inTheWoods{
 public:
 printInfo();
 }

test.cpp file:

void player::setX(){
cout << "Set X to a number:" << endl;
cin >> x
}

int player::getX(){
return x;
} 


int inTheWoods::printInfo(){
player playerObj; //Player object to access methods in player class
cout << playerObj.getX();
}

main.cpp:

int main(){
inTheWoods woodsObj;
woodsObj.printInfo();
return 0;
}

Whenever I run my program that resembles this problem the int does not display correctly and throws me a strange negative number. I hope this isnt too much code and that I documented everything correctly

Upvotes: 0

Views: 249

Answers (2)

user9267359
user9267359

Reputation:

Here is the working one. It's always a good practice to give a constructor, in order to create an instance with some default values. the following code will work hopefully according to your requirements:

main.cpp

#include <iostream>
#include "inTheWoods.h"

int main()
{
    inTheWoods woodsObj;
    woodsObj.printInfo();
    return 0;
}

player.h

#pragma once

class player
{
private:
    int m_x;
public:
    player();
    player(const int& x);

    void setX();            //method for setting X from user input
    const int& getX()const; //Method for retrieving variable
};

player.cpp

#include "player.h"
#include <iostream>

player::player()              // defualt constructor
    :m_x(0) {}

player::player(const int& x)
    :m_x(x) {}                // parameterised

void player::setX()
{
    std::cout << "Set X to a number:" << std::endl;
    std::cin >> m_x;
}

const int& player::getX()const
{
    return m_x;
}

inTheWoods.h

#pragma once

class inTheWoods
{
public:
    inTheWoods();
    ~inTheWoods();
    void printInfo();
};

inTheWoods.cpp

#include "inTheWoods.h"
#include "player.h"
#include <iostream>
inTheWoods::inTheWoods() {}

inTheWoods::~inTheWoods() {}

void inTheWoods::printInfo()
{
    //Player object to access methods in player class
    player playerObj;      // will beinitialized with 0
    player playerObj2(10); // will beinitialized with 10
    std::cout << playerObj.getX() <<std::endl;
    std::cout << playerObj2.getX() <<std::endl;
}

Edit: Well if you wanna allow the user to set values your printInfo() must be as follows:

void inTheWoods::printInfo()
{
    //Player object to access methods in player class
    player playerObj;      // will beinitialized with 0
    playerObj.setX();
    std::cout << playerObj.getX() <<std::endl;
}

Upvotes: 1

Aditya
Aditya

Reputation: 449

If you want the classes to be in a separate files, it should still work:

Main.cpp

#include <iostream>
#include "inTheWoods.h"


int main()
{
    inTheWoods woodsObj;
    woodsObj.printInfo();
    return 0;
}

Player.h

#pragma once
#include <iostream>
class Player
{
    int x = 10;
    void setX();
public:
    int getX();
};

Player.cpp

#include "Player.h"

void Player::setX()
{
    std::cout << "Set X to a number:" << std::endl;
    std::cin >> x;
}

int Player::getX()
{
    return x;
}

inTheWoods.h

//#pragma once
#include "Player.h"
#include <iostream>

class inTheWoods
{
public:
    void printInfo();
};

inTheWoods.cpp

#include "inTheWoods.h"

void inTheWoods::printInfo()
{
    Player playerObj; //Player object to access methods in player class
    std::cout << playerObj.getX();
}

#pragma once is a preprocessor that prevents multiple includes, in case you didn't know. You can choose to skip it (Visual Studio auto-generated the file with the line).


In summary, these are the changes I needed to make from your implementation:

  1. Move declaration of getX() from private to public.
  2. Add semicolons to the end of every class.
  3. Add a return type to printInfo(). If you don't want a function to return anything, the return type is void. Unless you care declaring a constructor, which doesn't seem to be the case here.

Upvotes: 1

Related Questions