【问题标题】:How to keep a list of instances of a class?如何保留一个类的实例列表?
【发布时间】:2010-07-10 04:41:23
【问题描述】:

我正在用 C++ 编写光线追踪器,并且需要能够检查与场景中每个对象的交集(稍后会进行优化),为此,我需要保留一个正在运行的类实例列表。创建新实例时更新的指针列表将不起作用,因为据我所知,在初始化后无法增加数组的大小。如果有的话,我真的很想要一个内置的(针对 C++ 的)解决方案。

【问题讨论】:

标签: c++ pointers raytracing


【解决方案1】:

您可以使用任意数量的 STL 容器。

STL Container Reference

【讨论】:

    【解决方案2】:

    创建一个指向场景中对象的指针vector(或set)作为静态类成员,并让所有的ctor将this插入到集合中,并将dtor删除this来自收藏:

    // really pseudo-code -- not intended to compile as-is, but I hope it helps
    // convey the general idea.
    //
    class scene_object { 
        static std::set<scene_object const *> instances;
    public:
    
        scene_object() : { instances.insert(this); }
        scene_object(scene_object const &other) { instances.insert(this); }
        // probably more ctors here...
    
        ~scene_object() { instances.delete(this); }
    };
    
    std::set<scene_object> scene_object::instances;
    

    【讨论】:

      【解决方案3】:

      我正在用 C++ 编写光线追踪器,并且需要能够检查与场景中每个对象的交点 [...]

      标准方法是空间图。最常用的是八叉树,因为它们可以在 3 维空间中表达位置。简单地说,空间树看起来像这样:

      struct SpatialNode {
          SpatialNode * children[8];
          std::vector<object*> objects;
      };
      

      每个节点都有一个(隐式或显式)位置和大小。当一个新对象添加到世界场景中时,树会穿过孩子(占据由 x-y、y-z 和 z-x 平面分割的八分圆:4 上、4 下;4 左、4 右;4 后, 4 在前面),并且该对象仅添加到可以完全包含它的最小节点。 (显然,您需要能够计算对象的尺寸以及它们是否可以完全包含在给定区域内。)

      这具有相当快的好处(只有被检查的树部分实际上是相关的),无论是在填充它还是在搜索它时。您可以在 Wikipedia、GameDev.net 和其他地方阅读有关它的几篇文章。

      【讨论】:

      • 我接受这个答案是因为它向我展示了为什么我应该首先使用优化的结构。谢谢!
      • 好吧,当我想销毁我得到的对象时:警告 C4150:删除指向不完整类型“MyClass”的指针;没有调用析构函数
      【解决方案4】:

      std::vector 应该没问题(它 C++ 标准的一部分)。

      【讨论】:

      • 由于每个对象的内存位置都是唯一的(因为每个对象都是独立创建的),您只需要在向量中存储一个指向每个对象的指针,这样会更容易一些。跨度>
      猜你喜欢
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多