【问题标题】:How do I compile code that uses circular references? [closed]如何编译使用循环引用的代码? [关闭]
【发布时间】:2020-02-04 18:20:35
【问题描述】:

我在 c++ sfml 中得到了一个蛇的代码。我在这里有 2 个对象 Snake 和 Food,还有一个 main(),其中包含 Windows 的 sfml 设置。我会简单地创建 3 个从 main 调用的对象,但它会导致循环引用并且无法编译。

我想要的是(或接近以下想法的东西)。

int main
{ 
    Food food(window); 
    Snake snake(window, food); 
    Window window(snake, food); 

    window.start(); 
}

蛇气方法draw需要引用它的窗口(绘制需要窗口句柄),更新也需要窗口(窗口大小)

食物也需要那些出于密切原因(需要绘制和窗口)

窗口反过来有它的窗口循环,它需要从那里调用蛇和食物的更新和绘制

//编辑

有人要求定义,但定义很简单

    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;

    }

【问题讨论】:

  • 使用某种引用或指针。不要直接包含对象,你的代码会编译得很好。可能需要额外的所有权管理,但现在使用shared_ptr 很容易。
  • 如果相关的话,我所说的答案在哪里?
  • 不,它似乎是关于标题的,我没有得到标题的问题,但有参考
  • 请发minimal reproducible example,我们可以发表评论。

标签: c++ oop circular-dependency


【解决方案1】:

如何编译具有循环引用的 c++ 代码?

您不能编译具有循环引用的 C++ 代码。

如果有循环引用,解决办法就是打破循环,让依赖图变成有向无环图。

C++中的间接引用除了引用还有另一种形式:指针。因为指针可以默认初始化并稍后赋值,所以它们可以形成循环结构。

一个可以打破循环初始化的模式是两阶段初始化:首先创建FoodSnake,与Window没有关联,只有在创建Window之后,调用执行第二阶段的函数的初始化。两阶段初始化不能与引用一起使用,但可以与指针一起使用。

【讨论】:

  • 我试图这样做,但引用似乎需要在构造函数中分配,所以我不能使对象未分配,然后再分配它......告诉我究竟要做什么......一些工作c++ 尽可能接近上面的,tnx
  • @J.Stone 因此,您不能将引用用于两阶段初始化。 C++ 中还有另一种形式的间接:指针。
  • 那该怎么办?
  • @J.Stone 我用解决方案编辑了评论。
  • 我没看到...
猜你喜欢
  • 2014-01-10
  • 2012-10-09
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
相关资源
最近更新 更多