2015-04-13 45 views
0

我有一个全局变量vector<BezierPatch*> listOfBezierPatches,我从命令行解析函数填充。然后,我有一系列的方法用于填充两个实例变量列出了BezierPatch实例变量列表中的对象没有被保留?指针问题?

// final list of subdivided triangles, ready to feed to OpenGL display system 
std::vector<Triangle*> listOfTriangles; 

// list of differential geometries (i.e. points) that we are evaluating the given patch at 
std::vector<DifferentialGeometry*> listOfDifferentialGeometries; 

main.cpp中:

void parseBezierFile(string filename) { 
    ... 
    BezierPatch* currentBezierPatch = new BezierPatch(); 
    while (getline(file, str)) { 
     ... 
     vector<Eigen::Vector3f> bezierCurve; 
     bezierCurve.push_back(vector_from_command_line); 
     ... 
     currentBezierPatch->addCurve(bezierCurve); 
     ... 
     listOfBezierPatches.push_back(currentBezierPatch);    
    } 

    perform_subdivision();  
} 

void perform_subdivision() { 
    // Iterate through each of the Bezier patches... 
    for (std::vector<BezierPatch*>::size_type i = 0; i < listOfBezierPatches.size(); i++) { 
     BezierPatch currentBezierPatch = *(listOfBezierPatches[i]); 
     currentBezierPatch.performUniformSubdivision(subdivisionParameter); 
    } 
} 

BezierPatch.h:

void performUniformSubdivision(float stepSize) { 
     int numberOfSteps = 1.0/stepSize; 
     for (int u = 0; u < numberOfSteps; u++) { 
      for (int v = 0; v < numberOfSteps; v++) { 
       listOfDifferentialGeometries.push_back(evaluateDifferentialGeometry(u * stepSize, v * stepSize)); 
      } 
     } 

     // Iterate through all of our differential geometries, but do NOT touch the right-most column and the bottom-most row 
     for (int u = 0; u < (numberOfSteps - 1); u++) { 
      for (int v = 0; v < (numberOfSteps - 1); v++) { 
       // (u, v) represents the index in the above grid that we're triangulating 
       // This index represents the TOP LEFT corner of the 4-point rectangle that is described above 

       // Index of listOfDifferentialGeometries that corresponds with position (u, v) 
       int differentialGeometrixIndex = (u * numberOfSteps) + v; 

       // Construct tri-1 
       listOfTriangles.push_back(new Triangle(
         *listOfDifferentialGeometries[differentialGeometrixIndex], // top left 
         *listOfDifferentialGeometries[differentialGeometrixIndex + numberOfSteps], // move one unit right 
         *listOfDifferentialGeometries[differentialGeometrixIndex + 1])); // move one unit down from top left 

       // Construct tri-2 
       listOfTriangles.push_back(new Triangle(
         *listOfDifferentialGeometries[differentialGeometrixIndex + numberOfSteps], // top right 
         *listOfDifferentialGeometries[differentialGeometrixIndex + 1], // bottom left 
         *listOfDifferentialGeometries[differentialGeometrixIndex + numberOfSteps + 1])); // bottom right 
      } 
     } 

     // We should have (numberOfSteps - 1) * (numberOfSteps - 1) * 2 triangles 
    } 

DifferentialGeometry* evaluateDifferentialGeometry(float u, float v) { 
    ... 
    return new DifferentialGeometry(finalVCurve.point, normal, Eigen::Vector2f(u, v)); 
} 

问题:

之后所有的a bove代码已经运行,如果我遍历listOfBezierPatches中的BezierPatches,则listOfTriangleslistOfDifferentialGeometries都是空的。我知道这显然是与本地指针/变量有关,但我似乎无法弄清楚。这里的一个详细请看perform_subdivision方法,发生问题:

void perform_subdivision(bool adaptive_subdivision) { 
    // Iterate through each of the Bezier patches... 
    for (std::vector<BezierPatch*>::size_type i = 0; i < listOfBezierPatches.size(); i++) { 
     BezierPatch currentBezierPatch = *(listOfBezierPatches[i]); 
     currentBezierPatch.performUniformSubdivision(subdivisionParameter); 

      // ***** TESTING: This successfully prints out our differential geometries ***** // 
      // Iterate through Triangles in the current Bezier patch 
      for (std::vector<DifferentialGeometry>::size_type j = 0; j < currentBezierPatch.listOfDifferentialGeometries.size(); j++) { 
       DifferentialGeometry* currentDifferentialGeometry = currentBezierPatch.listOfDifferentialGeometries[j]; 
       cout << " DifferentialGeometry " << (j + 1) << ":\n"; 
       Eigen::Vector3f currentPosition = currentDifferentialGeometry->position; 
       cout << "  (" << currentPosition.x() << " , " << currentPosition.y() << " , " << currentPosition.z() << ")\n"; 
      } 

      // This does NOT successfully print out our differential geometries... 
      printDifferentialGeometriesInBezierPatches();  
     } 
    }  
} 

其中printDifferentialGeometriesInBezierPatches()定义为:

//**************************************************** 
// function that prints all differential geometries in every Bezier Patch 
//*************************************************** 
void printDifferentialGeometriesInBezierPatches() { 
    if (debug) { 
     // Iterate through Bezier Patches 
     for (std::vector<BezierPatch*>::size_type i = 0; i < listOfBezierPatches.size(); i++) { 
      cout << " Bezier patch " << (i + 1) << ":\n\n"; 

      // Iterate through Triangles in the current Bezier patch 
      for (std::vector<DifferentialGeometry>::size_type j = 0; i < listOfBezierPatches[i]->listOfDifferentialGeometries.size(); j++) { 
       DifferentialGeometry* currentDifferentialGeometry = listOfBezierPatches[i]->listOfDifferentialGeometries[j]; 
       cout << " DifferentialGeometry " << (j + 1) << ":\n"; 
       Eigen::Vector3f currentPosition = currentDifferentialGeometry->position; 
       cout << "  (" << currentPosition.x() << " , " << currentPosition.y() << " , " << currentPosition.z() << ")\n"; 
      }  
     } 
    } 
} 

任何建议,将不胜感激。谢谢!

+0

那么,你可能需要向我们展示一些类和它们的拷贝构造函数。像'push_back'这样的函数复制对象。 – jww

+0

我正在使用'DifferentialGeometry'和'Triangle'的编译器定义的默认拷贝构造函数 - 这两个类都没有实例变量是指针。一个'Triangle'具有三个'DifferentialGeometry'实例变量,一个'DifferentialGeometry'具有两个'Eigen :: Vector3f'实例变量。 –

+1

@RyanYu'这两个类都没有实例变量是指针。“那么,为什么你有这些类型的指针向量?为什么不简单地'std :: vector '和'std :: vector '?与所有向量相同的东西 - 为什么不使用对象并忘记指针? – PaulMcKenzie

回答

0

也许在下一行的问题perform_subdivision

BezierPatch currentBezierPatch = *(listOfBezierPatches[i]); 

为您创建一个副本在循环

void perform_subdivision() { 
    // Iterate through each of the Bezier patches... 
    for (std::vector<BezierPatch*>::size_type i = 0; i < listOfBezierPatches.size(); i++) { 
     // ! Here you create a copy of i-th element 
     BezierPatch currentBezierPatch = *(listOfBezierPatches[i]); 
     // populate its memebers 
     currentBezierPatch.performUniformSubdivision(subdivisionParameter); 
    } 
} 

我猜的末尾删除每一个元素,这将是正确的

void perform_subdivision() { 
    // Iterate through each of the Bezier patches... 
    for (std::vector<BezierPatch*>::size_type i = 0; i < listOfBezierPatches.size(); i++) { 
     BezierPatch* currentBezierPatch = listOfBezierPatches[i]; 
     currentBezierPatch->performUniformSubdivision(subdivisionParameter); 
    } 
}