我正在使用ncurses库实现俄罗斯方块游戏。 我试图实现密钥处理程序类,它有成员函数名为timeout和getch。
key_handler.h
#ifndef KEY_HANDLER_H_
#define KEY_HANDLER_H_
#include "tetris.h"
#include <ncurses.h>
namespace tetris {
class KeyHandler {
public:
KeyHandler();
~KeyHandler();
void timeout(int timeout_ms);
int getch();
private:
WINDOW *window_;
int timeout_ms_;
};
}
#endif
key_handler.cpp
#include "key_handler.h"
using tetris::KeyHandler;
KeyHandler::KeyHandler() {
window_ = newwin(0, 0, 0, 0);
timeout_ms_ = 1000; // ms
curs_set(0);
cbreak();
noecho();
keypad(window_, TRUE);
}
KeyHandler::~KeyHandler() {
delwin(window_);
}
void KeyHandler::timeout(int timeout_ms) {
timeout_ms_ = timeout_ms;
}
int KeyHandler::getch() {
wtimeout(window_, timeout_ms_);
int ch = wgetch(window_);
return ch;
}
当我使用g ++编译时,它说:
$ g++ -c key_handler.cpp
In file included from key_handler.cpp:1:
key_handler.h:12: error: ‘stdscr’ is not a type
key_handler.h:13: error: ‘stdscr’ is not a type
key_handler.cpp:19: error: variable or field ‘wtimeout’ declared void
key_handler.cpp:19: error: expected primary-expression before ‘int’
key_handler.cpp:23: error: ‘int tetris::KeyHandler::wgetch’ is not a static member of ‘class tetris::KeyHandler’
key_handler.cpp:23: error: invalid conversion from ‘WINDOW*’ to ‘int’
key_handler.cpp:23: error: expected ‘,’ or ‘;’ before ‘{’ token
$
实际上ncurses库中存在超时和getch。 但我认为它们在不同的命名空间中就可以了。 当我使用其他名称,如timeoutff和getchff g ++编译成功。 我认为编译因函数名称重复而失败。 我不想改变我的功能名称。 我该怎么办?为什么会发生这种情况?我不明白。这是否与ncurses libary有关,或者即使使用STL也是C ++的一般问题?
感谢。
答案 0 :(得分:4)
timeout和getch在ncurses.h中被定义为宏
#define timeout(delay) wtimeout(stdscr,delay)
#define getch() wgetch(stdscr)
因此预处理器正在替换你的函数,然后再进行实际的c ++编译。