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
};
答案 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
成员的访问权限,您可以将其设为朋友类,或提供公共访问方法。