我正在使用C ++游戏教程,我无法弄清楚为什么我创建的类对象给出了“Expression必须具有类类型”的错误。该对象称为“menuEvent”,当您将鼠标悬停在变量上时,在简介的第一行显示“sf :: Event menuEvent”,然后在简介的第二行显示“Error:expression必须具有类类型” ”。它在相同的简报中是矛盾的,我无法弄明白。我正在使用C ++代码在Visual Studio 2015中工作。任何帮助将非常感激。这就是我所拥有的;
这篇文章来自我的一个外部依赖文档;
namespace sf
{
class Event
{
public:
struct MouseButtonEvent
{
Mouse::Button button; ///< Code of the button that has been pressed
int x; ///< X position of the mouse pointer, relative to the left of the owner window
int y; ///< Y position of the mouse pointer, relative to the top of the owner window
};
};
}
然后这件作品来自我的一个源文件;
MainMenu::MenuResult MainMenu::HandleClick(int x, int y)
{
std::list<MenuItem>::iterator it;
for (it = _menuItems.begin(); it != _menuItems.end(); it++)
{
sf::Rect<int> menuItemRect = (*it).rect;
if(menuItemRect.contains(sf::Vector2<int>(x,y)))
{
return it->action;
}
}
return Nothing;
}
MainMenu::MenuResult MainMenu::GetMenuResponse(sf::RenderWindow& window)
{
sf::Event menuEvent;
while (true)
{
window.pollEvent(menuEvent);
// The above line with menuEvent it reads as being of the sf::Event type
if (menuEvent.type == sf::Event::MouseButtonPressed)
{
//But the below line here when I hover over "menuEvent" it shows that it's of the sf::Event type, but then right below that it says "Error:expression must have class type".
return HandleClick(menuEvent.MouseButtonPressed.x , menuEvent.MouseButtonPressed.y);
}
if (menuEvent.type == sf::Event::Closed)
{
return Exit;
}
}
}
答案 0 :(得分:0)
您宣布了一个名为sf::Event
的课程。
此类声明一个名为MouseButtonEvent
的内部类。
MouseButtonEvent
不是班级成员。这是一个内心阶层。
您声明了名为“menuEvent”的sf::Event
实例:
sf::Event menuEvent;
您的编译器无法编译以下表达式:
HandleClick(menuEvent.MouseButtonPressed.x,
menuEvent.MouseButtonPressed.y);
错误是因为sf::Event
没有名为MouseButtonPressed
的类成员(从技术上讲,这不完全正确,但我注意到这个问题没有“language-lawyer”标签,所以我正在快速地玩它......)
表达式“menuEvent.MouseButtonPressed”是对menuEvent
类名为“MouseButtonPressed”的成员的引用。
没有这样的班级成员。 MouseButtonPressed
是一个内部类,而不是类成员。
我的代码的意图并不清楚,所以我无法建议代码在这里尝试完成的正确语法。
答案 1 :(得分:0)
那就做到了!非常感谢Sam Varshavchik的帮助。
这是我的最终代码版本;
外部作品;
namespace sf {
class Event
{
public:
struct MouseButtonEvent
{
Mouse::Button button; ///< Code of the button that has been pressed
int x; ///< X position of the mouse pointer, relative to the left of the owner window
int y; ///< Y position of the mouse pointer, relative to the top of the owner window
};
MouseButtonEvent btnVariable;
}
}
源文件;
MainMenu::MenuResult MainMenu::HandleClick(int x, int y)
{
std::list<MenuItem>::iterator it;
for (it = _menuItems.begin(); it != _menuItems.end(); it++)
{
sf::Rect<int> menuItemRect = (*it).rect;
if(menuItemRect.contains(sf::Vector2<int>(x,y)))
{
return it->action;
}
}
return Nothing;
}
MainMenu::MenuResult MainMenu::GetMenuResponse(sf::RenderWindow& window)
{
sf::Event menuEvent;
while (true)
{
window.pollEvent(menuEvent);
if (menuEvent.type == sf::Event::MouseButtonPressed)
{
return HandleClick(menuEvent.btnVariable.x , menuEvent.btnVariable.y);
}
if (menuEvent.type == sf::Event::Closed)
{
return Exit;
}
}
}