-1

这是我的构造函数。

SceneContainer::SceneContainer()
   :
    m_BVH(Allshapes, 0)
    {
        ParseJSONDataIntoShapeData("ShapeList.json");
    }

这是场景类声明。

class SceneContainer{
public:
void ParseJSONDataIntoShapeData(std::string filename);

private:
BVHNode m_BVH;
std::vector<shape*> Allshapes;
};

所以给定一个像这样的 JSON 文件。

  {
      "scene": {
        "shape": [{
          "center": "1.0 1.0 1.0",
          "radius": 1,
          "_name": "sphere1",
          "_type": "sphere"
        },
{
          "center": "2.0 2.0 2.0",
          "radius": 1,
          "_name": "sphere2",
          "_type": "sphere"
        },
{
          "center": "3.0 3.0 3.0",
          "radius": 1,
          "_name": "sphere3",
          "_type": "sphere"
        },
{
          "center": "3.0 3.0 3.0",
          "radius": 1,
          "_name": "sphere4",
          "_type": "sphere"
        }]
      }
    

然后 parseJSONDataIntoShapeData 将遍历文件中的所有形状并 push_back 指向在文件中创建的形状的指针。一些伪代码看起来像。

for(all shapes in json file)
    Create shape pointer from shape data
    push_back shape pointer to AllShapes.

在调用 parseJSONdata 之后,Allshapes 向量中会有四个形状。但是,由于构造函数如何与我的原始实现一起工作,因此 m_BVH 使用空向量进行初始化,因为 ParseJSONData 在 m_BVH 初始化后被调用,而我希望它使用其中的形状数据进行初始化。

4

1 回答 1

0

因此,您有一些分配给班级成员的功能。但是你还有另一个类的成员将消耗第一个成员的内容。

你应该有一个函数,它返回用于初始化第一个成员的数据,然后你可以将它用作第二个成员的构造函数的一部分:

class SceneContainer{
public:
  //Doesn't set data into the object.
  static std::vector<shape*> ParseJSONDataIntoShapeData(std::string filename);

  //Setting the data into the object is a separate step.
  void ResetJSONDataIntoShapeData(std::string filename)
  {
    //Free Allshapes;
    Allshapes = ParseJSONDataIntoShapeData(filename);
    m_BVH.reassign(Allshapes, 0); //Tells the m_BVH object that its data has changed.
  }

private:
  std::vector<shape*> Allshapes;
  BVHNode m_BVH;
};

SceneContainer::SceneContainer()
  : Allshapes(ParseJSONDataIntoShapeData("ShapeList.json"))
  , m_BVH(Allshapes, 0)
  {}

Allshapes请注意, and的声明顺序发生了m_BVH变化。这很重要,因为声明这些对象的顺序将决定它们的初始化顺序。

于 2021-04-25T00:58:35.327 回答