如何在另一个类中定义的类知道它的父类?

时间:2014-01-03 12:29:03

标签: c++ class layout

class App
{
    public:
             App(int X, int Y, char* TITLE);
        void run(void);
    public: // Getters
        sf::RenderWindow *getWindow(void);
        sf::Event        *getEvent (void);
        sf::Keyboard     *getKboard(void);
    private: // Variables
        sf::RenderWindow window;
        sf::Event         event;
        sf::Keyboard     kboard;
        #include "game.hpp" // The definition of the Game class
        Game game;
};

主循环。

void App::run(void)
{
    while (window.isOpen())
    {
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed) window.close();
            game.run(); // works fine
        }
    }
}

Game类的定义:

class Game
{
    public:
             Game(void);
        void run(void);
};

我希望Game类能够访问App类的变量。怎么样?

方法1:游戏类能够调用App的公共功能。

方法2:游戏类能够使用App的受保护变量。

class App
{
    public:
             App(int X, int Y, char* TITLE);
        void run(void);
    protected: // Variables
        sf::RenderWindow window;
        sf::Event         event;
        sf::Keyboard     kboard;
    private:
        #include "game.hpp" // The definition of the Game class
        Game game;
};

无论哪种方式,游戏类都需要知道它的父...我如何配置它的构造函数呢?

我还可以让游戏类有自己的变量,但是根本没有使用嵌套类......

<小时/> 解决方案:方法3,将Game类声明为App的朋友。

#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
class App
{
    friend class Game; // THE SOLUTION
    public:
             App(const int X, const int Y, const char* NAME); // now using const
        void run(); // not using void to identify empty arguments list anymore
    private: // Variables
        sf::RenderWindow window;
        sf::Event         event;
        sf::Keyboard     kboard;
};
#include "game.hpp"

现在是game.hpp:

class Game
{
    public:
            // A little bit of redundacy here, but it works!!!
            Game(const int X, const int Y, const char* TITLE) :app(X, Y, TITLE)
            { /* and the initialization of the Game class itself... */}
       void run()
            { app.run(); /* And the running process of Game class itself*/};
     private:
       App app; // Now the Game class owns App and not contrary
 };

3 个答案:

答案 0 :(得分:0)

了解类之间的关系对您没有帮助,因为您需要一个对象(即实例)才能引用不同的对象。如果您希望一个对象能够访问另一个对象的成员,那么您需要在那里引用该另一个对象。

例如,当您致电App时,您可以将引用传递给run的实例。

class Game
{
    public:
             Game();
        void run(const App& app);
};

或者,如果您愿意,可以创建App&类型的私有成员,并在构造函数中初始化该引用。

就个人而言,我认为你的嵌套没有理由,也没有你的独特头文件。这些类绑定在一起,所以我将它们放在同一个标​​题中。它可能看起来像这样:

class App; // forward declaration

class Game
{
    public:
        void run(const App& app);
};

class App
{
    public:
             App(const int X, const int Y, const char* TITLE);
        void run();
    private:
        Game game;
};

顺便说一下,使用void来表示空参数列表不是惯用的C ++。并且您应尽可能使用const使该类的任何使用者都可以传递const对象。

答案 1 :(得分:0)

您需要为其提供指向其父级的指针或引用

class Game
{
public:
    explicit Game(App & app) : app(app) {}
    void run(void);
private:
    App & app;
};

从C ++ 11(以及某些流行编译器的早期版本)开始,作为嵌套类,它可以访问App的所有成员。在某些2011年之前的编译器中,如果需要访问私有或受保护的成员,则需要friend class Game;中的App声明。

答案 2 :(得分:0)

您可以将App类的引用传递到游戏类中,如下所示:

class Game
{
public:
    Game(App &app);
    void run(void);

private:
    App & m_app;
};

然后在构造函数的定义中,您可以这样做:

Game::Game(App &app) :
    m_app(app)
{
   // Game constructor stuff here.
}

然后,在App构造函数中,您可以这样做:

App::App(int X, int Y, char* TITLE) :
    game(*this)
{
    // App constructor stuff here.
}

您希望如何提供App成员的访问权限,您可以将其设为朋友类,或提供公共访问方法。