Сохранить позицию курсора в объекте класса (ncurses c ++) - PullRequest
0 голосов
/ 06 мая 2018

Я использую QTCreator для компиляции моего кода на C ++ и библиотеки <curses.h>.

Допустим, у нас есть следующее определение класса (.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);
};

и (.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;
}

В моем main.cpp я пытаюсь сохранить текущую позицию курсора в экземпляре Rogue:

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

Но я всегда получаю сообщение об ошибке:

using temporary as lvalue [-fpermissive]

Это также показано ниже как часть ошибки, которая есть в <curses.h> файле

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

Хотя я могу просто сохранить эти значения в другой структуре, инициализированной в main.cpp, как я могу сохранить позиции x и y непосредственно в членах данных класса?

Спасибо.

1 Ответ

0 голосов
/ 06 мая 2018

Самое быстрое решение было бы изменить getHeroPosition, чтобы возвращать ссылку вместо значения:

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

Проблема в том, что вы пытаетесь присвоить Rogue позицию:

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

Это эквивалентно:

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

Но getHeroPosition возвращает позицию по значению (возвращает копию, значение). Если вы назначите значение этой временной копии, оно будет просто потеряно. Решение состоит в том, чтобы назначить ссылку на фактическую позицию Rogue (lvalue).

Кроме того, вы можете использовать существующую функцию setPosition:

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