将光标位置存储在 class 对象中 (ncurses c++)
Store cursor position in class object (ncurses c++)
我正在使用 QTCreator 编译我的 C++ 代码和 <curses.h>
库。
假设我们有以下 class 定义 (.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 位置直接存储在 class 数据成员中?
谢谢。
最快的解决方案是将 getHeroPosition
更改为 return 引用而不是值:
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
return 是值的位置(它 return 是一个副本,一个右值)。如果您为该临时副本分配一个值,它将丢失。解决方案是分配给对实际 Rogue
位置(左值)的引用。
或者,您可以使用现有的 setPosition
函数:
coordinateYX position;
getyx(stdscr, position.X, position.Y);
Hero.setPosition(position);
我正在使用 QTCreator 编译我的 C++ 代码和 <curses.h>
库。
假设我们有以下 class 定义 (.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 位置直接存储在 class 数据成员中?
谢谢。
最快的解决方案是将 getHeroPosition
更改为 return 引用而不是值:
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
return 是值的位置(它 return 是一个副本,一个右值)。如果您为该临时副本分配一个值,它将丢失。解决方案是分配给对实际 Rogue
位置(左值)的引用。
或者,您可以使用现有的 setPosition
函数:
coordinateYX position;
getyx(stdscr, position.X, position.Y);
Hero.setPosition(position);