子函数中的已赋值对象未在父函数中更新

Assigned objects in child function not updated in parent function

本文关键字:更新 函数 对象 赋值 子函数      更新时间:2023-10-16

这是一个与法律相关的问题,但我认为这也是一个通用的c++问题,所以我在这里问它。

我试图使用Alpha_shape_2类,并在名为GetAlphaShalCg的子程序中将其分配给AlphaShapeCg类。问题是Alpha_shape_2中的一些函数没有返回正确的结果。

这是我的代码,它真的很简单,但我不太知道为什么在子例程中将Alpha_shape_2分配给包装器,然后访问父例程中的成员和直接访问Alpha_shape_2之间存在差异。

这里是完整的代码,如果您安装了CGAL,您可以编译并使用它。

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/algorithm.h>
#include <CGAL/Delaunay_triangulation_2.h>
#include <CGAL/Alpha_shape_2.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <list>

typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::FT FT;
typedef K::Point_2  Point;
typedef K::Segment_2  Segment;

typedef CGAL::Alpha_shape_vertex_base_2<K> Vb;
typedef CGAL::Alpha_shape_face_base_2<K>  Fb;
typedef CGAL::Triangulation_data_structure_2<Vb,Fb> Tds;
typedef CGAL::Delaunay_triangulation_2<K,Tds> Triangulation_2;
typedef CGAL::Alpha_shape_2<Triangulation_2>  Alpha_shape_2;

template <class OutputIterator>
bool
file_input(OutputIterator out)
{
  std::ifstream is("./data/fin", std::ios::in);
  if(is.fail()){
    std::cerr << "unable to open file for input" << std::endl;
    return false;
  }
  int n;
  is >> n;
  std::cout << "Reading " << n << " points from file" << std::endl;
  CGAL::copy_n(std::istream_iterator<Point>(is), n, out);
  return true;
}
//------------------ main -------------------------------------------

struct AlphaShapeCg
{
    Alpha_shape_2 *AlphaShape;
};
void GetAlphaShalCg(AlphaShapeCg *ashape,  std::list<Point> points)
{
      Alpha_shape_2 A(points.begin(), points.end(),
          FT(100000),
          Alpha_shape_2::GENERAL);
    ashape->AlphaShape=&A;
}

int main()
{
  std::list<Point> points;
  if(! file_input(std::back_inserter(points))){
    return -1;
  }
   AlphaShapeCg ashape;

   GetAlphaShalCg(&ashape, points);
   Alpha_shape_2 *APtrs=(ashape.AlphaShape);
   int alphaEigenValue = APtrs->number_of_alphas(); // gives incorrect result; alphaEigenValue=0
  //Alpha_shape_2 A(points.begin(), points.end(),
  //  FT(100000),
  //  Alpha_shape_2::GENERAL);
  //   int alphaEigenValue = APtrs->number_of_alphas(); // gives correct result; alphaEigenValue!=0
}

更新:我试图使用

Alpha_shape_2 =new A(points.begin(), points.end(), FT(100000), Alpha_shape_2::GENERAL);

但是这段代码根本无法编译,因为这个错误:

错误C2513: 'CGAL::Alpha_shape_2':没有先前声明的变量' = '

你将一个指针赋值给一个局部变量,该局部变量在退出函数时被销毁。

如果你想在函数中创建对象并返回它的地址-你应该使用动态分配(new它,不要忘记delete当你完成它)