我使用的是SFML,并且有类似以下的类:
#include <SFML\Graphics.hpp>
class Overlay
{
public:
Overlay(int width, int height);
Overlay(const sf::Texture*);
Overlay(const sf::Sprite*);
~Overlay();
private:
sf::Texture _texture;
sf::Image _img;
};
现在,Overlay(const sf::Sprite*)
的以下构造函数正在运行:
Overlay::Overlay(const sf::Sprite* spr) {
int width = spr->getTexture()->getSize().x;
int height = spr->getTexture()->getSize().y;
_texture.create(width, height);
_img.create(width, height, sf::Color::Transparent);
}
但是,以下嵌套构造函数不是:
Overlay::Overlay(int width, int height)
{
_texture.create(width, height);
_img.create(width, height, sf::Color::Transparent);
}
Overlay::Overlay(const sf::Texture* tex) {
sf::Vector2u textureSize = tex->getSize();
Overlay(textureSize.x, textureSize.y);
}
Overlay::Overlay(const sf::Sprite* spr) {
Overlay(spr->getTexture());
}
对我看来,如果执行以下操作,两个片段应该做同样的事情:
sf::Sprite image;
Overlay mOverlay(&image);
虽然它们都编译得很好,但是当调用第二个代码片段(嵌套构造函数)时,_img
最终的大小为0,其m_pixels
数组为空。
答案 0 :(得分:3)
听起来你正在寻找Delegating Constructor。
要使用委托构造函数,它应该出现在另一个构造函数的成员初始化列表中,而不是构造函数 body 。
在第二个片段中,您正在构建堆栈的临时Overlay
对象。当构造函数返回时,临时文件被销毁并且没有效果。
尝试像这样定义构造函数:
Overlay::Overlay(const sf::Sprite& spr)
: Overlay(spr.getTexture())
{
}
注意我是如何使用const sf::Sprite&
而不是const sf::Sprite*
的?由于spr
为nullptr
的情况未被处理,因此通过引用传递它以确保它引用对象是有意义的。这也解决了在调用构造函数之后拥有纹理的任何问题。
执行此操作时,您还应考虑使用explicit
keyword声明构造函数,如下所示:
class Overlay
{
public:
explicit Overlay(const sf::Texture&);
explicit Overlay(const sf::Sprite&);
};
这可以防止Texture
和Sprite
在传递它们时意外变成Overlay
。