将光标位置存储在类对象中(ncurses c++)

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

本文关键字:ncurses c++ 对象 光标 位置 存储      更新时间:2023-10-16

我正在使用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;
}

在我的主.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 位置直接存储在类数据成员中?

谢谢。

最快的解决方案是更改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位置(左值)的引用。

或者,您可以使用现有的setPosition函数:

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