抽象基类中接口类的朋友声明

时间:2018-06-28 10:53:26

标签: c++ inheritance abstract-class friend interface-class

因此,我当时正在考虑尝试使用sfml在c ++中编写俄罗斯方块游戏,然后我想到了如何实现该游戏,并意识到它可能是继承的一种可能。我以为我会:

-表示tetromino(在tetris中塑造拼图碎片)的抽象基类:其称为Tetromino_Base

-类将从基类继承来表示特定的tetromino,因为它们具有不同的形状,例如正方形,条形等。

-名为Tetromino的接口类,它是用户将操纵的类型。

在我走的时候,我意识到我的类接口需要访问抽象类成员,因此我为此做了一个朋友声明,但我想:这样做是一种好习惯吗?在基类中向朋友声明您的接口类?

这是代码的主要部分:

class Tetromino;

class Tetromino_Base {
    friend class Tetromino;
public:
    virtual ~Tetromino_Base() {};
protected:
    float m_x, m_y;
    sf::Texture m_texture;
    sf::VertexArray m_vertices;

    virtual bool create(const sf::Vector2f&, const float&, //position of the object, scale of the object
    const std::string&, const sf::Vector2f&, const float&) = 0; 
    //file name for the texture, position in the texture, scale of the texture
};

class Square : public Tetromino_Base {
public:
    ~Square() {}
private:
    bool create(const sf::Vector2f&, const float&, 
    const std::string&, const sf::Vector2f&, const float&);
};

class Tetromino : public sf::Drawable {
public:
    Tetromino(int tetroCode = 0);

    bool create(const sf::Vector2f& sorigins, const float& ssc, 
    const std::string& fileName, const sf::Vector2f& torigins, const float& tsc){
        //access needed here
        return p->create(sorigins,ssc,fileName,torigins,tsc);
    }

private:
    Tetromino(Tetromino_Base* ptr) : p (ptr) {}
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const {
        //access needed here
        states.texture = &(p->m_texture);
        target.draw(p->m_vertices, states); 
    }
    Ptr<Tetromino_Base> p;
};

0 个答案:

没有答案