- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在制作 Label 和 Button 类。 Label 基本上用作附加到 Button 的文本,而 Button 具有按钮的纹理和其他一些东西。
我想自动化一些事情,这样你就不必分别调用每个按钮的绘制方法,所以我创建了一个 ButtonManager 类,它有一个 vector 和一个静态绘制成员函数。
问题是, vector 包含接口(interface)类而不是常规接口(interface)类(用于 Button 类型的 future 扩展)。
在描述问题之前,让我们看一下代码:
所有按钮的基本界面文件:
class ButtonManager;
class ButtonBase{
typedef ButtonManager Manager;
public:
virtual int getType() = 0;
virtual void draw(sf::RenderWindow& target) = 0;
};
这个很简单
带有 ButtonManager 的文件(有点长):
class ButtonManager{
typedef ButtonBase* ptr;
static std::vector<ptr> container;
inline static ptr& __at(uint index)
{
if (index > container.size()) throw std::exception("bad index");
return container[index];
}
static void __push(const ptr& Pointer) { container.push_back(Pointer); }
static void __pop() { container.pop_back(); }
/*
Private to hide them from potentional unintended push or pop
*/
public:
enum{
DRAW_ALL = -1
};
static void draw(sf::RenderWindow& target, uint toDraw = DRAW_ALL)
{
std::cout << "container: " << container.size() << "\n";
if (toDraw == DRAW_ALL)
for(auto& a : container)
{
a->draw(target);
}
else
container.at(toDraw)->draw(target);
}
struct ClassImpl{
inline static ptr& at(uint index) { return ButtonManager::__at(index); }
inline static void push(const ptr& Pointer) { ButtonManager::__push(Pointer); }
inline static void pop() { ButtonManager::__pop(); }
};
};
std::vector<ButtonManager::ptr> ButtonManager::container;
最后,一个包含按钮本身的文件:
class Button final : public ButtonBase{
typedef ButtonBase parent;
mutable Label label;
mutable sf::Texture texture;
mutable sf::Sprite buttonImage;
mutable std::function<void(Button&, ButtonState/* enum class */)> callBack;
public:
Button() {}
Button(const sf::Vector2f& position, const sf::Vector2f& size, const std::string& imagePath,\
sf::IntRect& rect/*unsued*/, std::function<void(Button&, ButtonState)> f_ptr,\
const Label& _label) : label(_label), callBack(f_ptr)
//some code
Manager::ClassImpl::push(this);
}
//copy construct
Button(const Button& b);
//copy assign
Button& operator=(const Button& b);
//move assign
Button(Button&& b);
//move construct
Button& operator=(Button&& b);
int getType()
{
return 1;
}
void draw(sf::RenderWindow& window)
{
window.draw(buttonImage);
window.draw(label.getText());
}
};
注意:我尝试使 ButtonManager::ptr bth ButtonBase* 和 std::shared_ptr,但没有成功
我遇到的问题是,当我调用 ButtonManager::draw(someSFMLWindow) 时,当它尝试调用 a->draw(target) 时,它将写入控制台:
R6025- 纯虚函数调用
而我在调试代码的时候,第一行Button::draw调用(window.draw(buttonImage))时出现了错误。
问题出在哪里?有什么问题的线索吗?
最佳答案
到处使用静态元素通常会暴露糟糕的设计选择。静态成员变量本质上是突破所有“状态”的全局变量。我不会详细说明为什么应该避免使用全局变量,但是围绕这个主题有足够的话题,所以我相信您会找到一些东西。我也不是说静态函数在 C++ 中没有它们的位置,它只是使用“静态”来避免以封装方式处理对象的烦恼,并不是真正的解决方案。
正如评论中所建议的那样,通过派生自 sf::Drawable
很容易实现您想要的效果。
class Widget : public sf::Drawable {
virtual void draw(sf::RenderTarget &target, sf::RenderStates states) const = 0;
}
class Button final : public Widget {
void draw(sf::RenderTarget &target, sf::RenderStates states) const {
target.draw(m_button, states);
}
sf::Sprite m_button;
}
class WidgetManager {
public:
void draw(sf::RenderWindow &window) {
for(const auto &widget : m_widgets)
window.draw(widget);
}
private:
std::vector<std::unique_ptr<Widget>> m_widgets;
}
当然,您需要添加用于创建和删除小部件以及管理可见性(显示在另一个小部件前面/后面的内容)的函数。您可以为某些小部件制作静态创建工厂函数,但除此之外,您不应该制作静态函数,而是考虑设计以及如何减少类依赖性并防止“inject-WidgetManager-everywhere”综合症。
关于c++ - SFML C++ 绘制到 RenderWindow 纯虚函数运行时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21294413/
可以抛出异常的函数可以有[pure]属性吗? 最佳答案 根据 https://msdn.microsoft.com/en-us/library/system.diagnostics.contracts
我使用的是纯 css 推送导航。它工作得很好,但是我不知道如何在单击导航链接时隐藏菜单。您必须手动单击菜单图标才能使菜单返回隐藏状态。但是,当单击链接并且站点跳转到某个部分时,我希望菜单自动滑入隐藏状
我正在尝试让纯 CSS 下拉菜单正常工作。它在很大程度上确实有效,除了其他内容似乎显示出来但我不知道为什么。 http://jsfiddle.net/uQveP/4/ 有人可以告诉我我做错了什么吗?
这个问题在这里已经有了答案: What is a "callback" in C and how are they implemented? (9 个回答) 关闭 8 年前。 我正在以这种方式实现回
我想在不使用 Javascript 或任何其他语言的情况下,使用 HTML 和 CSS 创建一个 Page Back Button。我想用纯 HTML 和 CSS 来完成。 我进行了搜索,但每次代码中
我对序言很陌生。据我所知,Pure Prolog 仅限于 Horn 子句。 这是一个非常简单的序言程序 - % student( Snr , FirstName , LastName ,
我想在加载数据时对容器使用以下加载指示器。 问题是, slider 具有固定的宽度和高度(300 像素和 300 像素),但我希望它能够动态适应容器。当我尝试添加宽度时:140px;和高度:140px
当内容超过可用宽度时,我需要启用滚动阴影。这是我试图用纯 css(没有 JS)来实现的。我遇到了很多文章,可以使用 css 多背景和背景附件来实现。如果内容是文本类型,则可以使用下面的 jsfilld
我正在编写一个上古卷轴在线插件,它由一个名为 Havok Script 的轻微修改的 Lua 5.1 引擎支持。 .这个Lua环境不允许访问os , io , package , debug模块或任何
我自己尝试过将 Arduino 库编译成他们自己的独立库并链接到 Eclipse 中的一个项目,但在此过程中遇到了一些问题。 是否有关于如何启动和运行的体面指南?我一直很难在网上找到一个真正有效的..
我在这里遇到了一些麻烦。我正在尝试使用本地存储创建一个待办事项列表,但我唯一要做的就是将列表项添加到本地存储并删除 所有项目 从本地存储中删除,但我无法从列表中删除单个 SELECTED 项目。有人可
我的问题很简单。考虑以下 CodePen .是否有可能仅使用 css 就可以获得相同的结果?换句话说,如果不使用 javascrip 如何做到这一点?非常感谢! Nachos are
我正在使用没有 jquery 的 angularjs,并尝试创建滚动事件监听器。 尝试过这种方法: $rootScope.$watch(function() { return $windo
我正在尝试使用纯 webgl 创建虚线。我知道这已经有一个问题,也许我很笨,但我不知道如何让它发挥作用。我理解这个概念,但我不知道如何在着色器中获取沿路径的距离。以前的答案有以下行: varying
我正在尝试用纯 JavaScript 制作工具提示,显示在 hover .就像 Stack Overflow 中将鼠标悬停在配置文件名称上的一个 div显示。 我尝试使用 onmouseover ,
我想要通过 AJAX 将监听器添加到新元素的想法: 例如,现在我有 hello world 我为每个 添加了一个监听器,但是当我通过 AJAX 加载新元素时,它没有监听器;我不完全确定问题是什么。
如果我错误地提出了这个问题,或者之前已经有人问过并回答过这个问题,我提前表示歉意。我的搜索发现了类似的基于 JQuery 和/或静态日期的问答,我正在寻找具有动态日期的纯 JavaScript 解决方
在 Real World Haskell, Chapter 28, Software transactional memory ,开发了一个并发的网络链接检查器。它获取网页中的所有链接,并使用 HEA
我正在尝试取消 jQuery-fy 一个聪明的 piece of code ,但有点太聪明了。 目标是simple 。将图像从桌面拖动到浏览器。 在这次 unjQueryfication 过程中,我发
如何重新创建 jQuery end() $('#id') .find('.class') .css('font',f) .end() .find('.seven') .css(b,'red') 我有什
我是一名优秀的程序员,十分优秀!