我在c ++ sfml中得到了一个蛇的代码。我在这里得到了 2 个对象 蛇和食物,我还有一个包含窗口 sfml 设置的main()
。我只会制作 3 个从 main 调用的对象,但它会导致循环引用并且无法编译。
我想要的是(或接近下面的想法(。
int main
{
Food food(window);
Snake snake(window, food);
Window window(snake, food);
window.start();
}
蛇气法绘制需要参考其窗口(用于绘图,因为绘图需要窗口手柄(,并且更新 whuch 也需要窗口(对于窗口大小(
食物也需要那些接近的原因(需要画和窗苏兹(
窗口反过来有它的窗口循环,它需要从那里调用蛇和食物的更新和绘制
//编辑
有人要求定义,但定义是坚定的
class Snake;
class Food;
class Window
{
public:
Window::Window(Snake& s, Food& f): snake(s), food(f)
{
}
private:
Snake& snake;
Food& food;
}
class Snake
{
public:
Snake::Snake(Window& w, Food& f): window(w), food(f)
{
}
private:
Window& window;
Food& food;
}
class Food
{
public:
Snake::Snake(Window& w): window(w)
{
}
private:
Window& window;
}
如何编译具有循环引用的 C++ 代码?
不能编译具有循环引用C++代码。
如果你有一个循环引用,解决方案是打破循环,使依赖关系图变成有向无环图。
如果间接C++除了引用之外,还有另一种形式:指针。由于指针可以默认初始化并在以后分配,因此它们可以形成循环结构。
可以破坏循环初始化的模式是两阶段初始化:首先创建与Window
无关的Food
和Snake
,只有在创建Window
之后,调用执行第二阶段初始化的函数。两阶段初始化不能与引用一起使用,但可以与指针一起使用。