Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 实例变量列表中的对象未被保留?指针问题?_C++ - Fatal编程技术网

C++ 实例变量列表中的对象未被保留?指针问题?

C++ 实例变量列表中的对象未被保留?指针问题?,c++,C++,我有一个从命令行解析函数填充的BezierPatches的全局变量向量列表。然后我有一系列方法填充BezierPatch的两个实例变量列表: 其中,PrintDifferentialsGeometriesInBezierPatches定义为: //**************************************************** // function that prints all differential geometries in every Bezier Patch

我有一个从命令行解析函数填充的BezierPatches的全局变量向量列表。然后我有一系列方法填充BezierPatch的两个实例变量列表:

其中,PrintDifferentialsGeometriesInBezierPatches定义为:

//****************************************************
// 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";
            }    
        }
    }
}

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

您的问题可能会出现在执行细分的下一行中

为每个元素创建一个副本,该副本将在循环结束时删除

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);
    }
}

您可能需要向我们展示一些类及其复制构造函数。push_back之类的函数复制对象。我使用编译器定义的DifferentingGeometry和Triangle的默认复制构造函数-这两个类都没有作为指针的实例变量。三角形有三个DifferentingGeometry实例变量,DifferentingGeometry有两个Eigen::Vector3f实例变量。@RyanYu这两个类都没有作为指针的实例变量。那么为什么这些类型有一个指针向量呢?为什么不简单地使用std::vector和std::vector呢?所有向量都是一样的——为什么不直接使用对象而忘记指针呢?
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();    
        }
    }    
}
//****************************************************
// 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";
            }    
        }
    }
}
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);
    }
}