Search code examples
c++classstructpositionncurses

Store cursor position in class object (ncurses c++)


I am using QTCreator to compile my c++ code and the <curses.h> library.

Let us say we have the following class definition (.h):

struct coordinateYX
{
    int y;
    int x;

    coordinateYX(long int yPos, long int xPos);
    coordinateYX() {}
}

class Rogue
{
private:
    long int health;
    coordinateYX heroPosition;
public:
    long int getHealth();
    void setHealth(long int initHealth);
    void healthChange(long int vDelta);
    coordinateYX getHeroPosition();
    void setHeroPosition(coordinateYX hPos);
};

and (.cpp):

coordinateYX::coordinateYX(long int yPos, long int xPos) : y{yPos}, x{xPos} {}

long int Rogue::getHealth() {return health;}
void Rogue::setHealth(long int initHealth) {health = initHealth;}
void Rogue::healthChange(long int vDelta) {health += vDelta;}
coordinateYX Rogue::getHeroPosition() {return heroPosition;}
void Rogue::setHeroPosition(coordinateYX hPos)
{
    heroPosition.y = hPos.y;
    heroPosition.x = hPos.x;
}

In my main.cpp, I am trying to store the current cursor position into an instantiation of Rogue:

Rogue Hero;
getyx(stdscr, Hero.getHeroPosition().y, Hero.getHeroPosition().x);

But I always get an error:

using temporary as lvalue [-fpermissive]

It also shows this below as part of the error which is in the <curses.h> file

#define getyx(w, y, x)     (y = getcury(w), x = getcurx(w))

Although I can simply store these values in another struct initialized in main.cpp, how can I store the x and y positions directly in the class data members?

Thank you.


Solution

  • The quickest solution would be to change getHeroPosition to return a reference instead of value:

    coordinateYX& Rogue::getHeroPosition() {return heroPosition;}
    

    The problem is here you are trying to assign to the Rogue position:

    getyx(stdscr, Hero.getHeroPosition().y, Hero.getHeroPosition().x);
    

    This is equivalent to:

    Hero.getHeroPosition().y = getcury(stdscr);
    Hero.getHeroPosition().x = getcurx(stdscr);
    

    But getHeroPosition returns the position by value (it returns a copy, an rvalue). If you assign a value to that temporary copy it will just be lost. The solution is to assign to a reference to the actual Rogue position (an lvalue).

    Alternatively, you can use your existing setPosition function:

    coordinateYX position;
    getyx(stdscr, position.X, position.Y);
    Hero.setPosition(position);