【发布时间】:2014-02-13 04:31:54
【问题描述】:
我正在制作标签和按钮类。 Label 基本上是附加到 Button 上的文本,而 Button 具有按钮的纹理和其他一些东西。
我想把事情自动化,所以你不必单独调用每个按钮的绘制方法,所以我制作了一个 ButtonManager 类,它有一个向量和一个静态绘制成员函数。
问题是,向量包含接口类而不是常规类(用于按钮类型的未来扩展)。
在我描述问题之前,让我们看看代码:
所有按钮的基本界面文件:
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))。
问题出在哪里?任何提示问题出在哪里?
【问题讨论】:
-
为什么不在 ButtonManager 类中实现
sf::Drawable::draw? -
我不知道你想如何适应它,因为你知道,我可以在 main 中检查矢量并手动绘制,但我想自动化一些事情,所以你只需调用 ButtonManager: :draw(window) 并绘制所有创建的按钮编辑:我试过了,不要以为我没有
-
如果你在ButtonManager中实现
sf::Drawable::draw,那么你可以从任何地方sf::RenderWindow::drawButtonManager对象。在 SFML 应用程序中绘制其他所有内容的方式肯定会更加统一。你是如何尝试这样做的,但没有成功?如果你只是从 ButtonManager 扩展sf::Drawable,你应该没有任何问题 -
好吧,是的,我基本上必须重新制作这个类,因为它是静态的,现在它有 1 个全局成员,但是是的,它可以工作并且现在不会发疯,但是向量不会被填充原因,我现在累得懒得理,谢谢你的帮助!