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

4

我将使用QTCreator编译我的C++代码以及库。

假设我们有以下类定义(.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位置存储在类数据成员中呢?
谢谢。

@drescherjm 抱歉,我已经编辑了原始帖子并更正了错误信息。 - Shounak Ray
1个回答

1
最快的解决方法是将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按值返回位置(它返回一个副本,一个rvalue)。如果你给那个临时副本赋值,它就会丢失。解决方法是将值赋给实际Rogue位置的引用(一个lvalue)。
或者,您可以使用现有的setPosition函数:
coordinateYX position;
getyx(stdscr, position.X, position.Y);
Hero.setPosition(position);

谢谢!返回别名似乎解决了我的问题。然而,现在我实际上将无法获取该值,因为 print(playerCoordinate, Hero.getHeroPosition().y);(其中打印函数只在坐标处打印一个整数)不起作用。有什么解决方案,使我的get函数可以双向使用吗?我尝试过载,但也不起作用。 - Shounak Ray
它“不工作”的方式是什么?你得到了什么错误?我想不出为什么它不应该工作。你可以使用我的替代方案。 - Chris Drew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接