嵌套构造函数C ++

时间:2017-01-21 19:13:34

标签: c++ constructor nested sfml

我使用的是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数组为空。

1 个答案:

答案 0 :(得分:3)

委派构造函数。

听起来你正在寻找Delegating Constructor

要使用委托构造函数,它应该出现在另一个构造函数的成员初始化列表中,而不是构造函数 body

在第二个片段中,您正在构建堆栈的临时Overlay对象。当构造函数返回时,临时文件被销毁并且没有效果。

尝试像这样定义构造函数:

Overlay::Overlay(const sf::Sprite& spr)
    : Overlay(spr.getTexture())
{
}

小代码审核。

注意我是如何使用const sf::Sprite&而不是const sf::Sprite*的?由于sprnullptr的情况未被处理,因此通过引用传递它以确保它引用对象是有意义的。这也解决了在调用构造函数之后拥有纹理的任何问题。

执行此操作时,您还应考虑使用explicit keyword声明构造函数,如下所示:

class Overlay
{
public:
    explicit Overlay(const sf::Texture&);
    explicit Overlay(const sf::Sprite&);
};

这可以防止TextureSprite在传递它们时意外变成Overlay