c++中的shared_ptr,获取人脸的点数

问题描述

我有以下积分课程:

class MyPoint
{
    public:
    
        // Constructor
        MyPoint(double,double,double);

        // Destructor
        virtual ~MyPoint(){};

    protected:

    private:
        double x;
        double y;
        double z;

};

我想创建一个 myPoints 向量来存储一些数据:

vector <MyPoint> vectorOfPoints

for (int i = 0; i < 10 ; i++)
{
    vectorOfPoints.push_back(MyPoint(1,2,3));
}

我想创建一个名为 myFaces 的类来存储构成人脸的点的地址。

例如

面 A 由 vectorOfPoints[0]、vectorOfPoints[2]、vectorOfPoints[5] 和 vectorOfPoints[6] 构建。

如何将带有上述条目地址的向量传递给 myFace 类?

class myFace
{
    public:

        // Constructor  
        myFace(int,vector<std::shared_ptr<Point> > );

        // Destructor
        virtual  ~myFace(){};
       
         
    protected:

    private:
        int nPointsInFace_;
        vector<std::shared_ptr<Point> > refToPointsThatMakeUpThisFace_;
  
};

非常感谢您的帮助!

解决方法

面 A 由 vectorOfPoints[0]、vectorOfPoints[2]、vectorOfPoints[5] 和 vectorOfPoints[6] 构建。

你想要索引。所以存储它!

class myFace
{
    vector<size_t> indexes_;

    public:
        myFace(vector<size_t>) ...
};

您不需要 nPointsInFace_,因为它的大小为 indexes_

如果您知道不需要这么多类型,可以使用较小的类型,例如 uint16_t

您避免弄乱指针(以及 shared_ptr,这对于单个 3D 点来说太过分了)。

您可以进行检查访问。

,

可能最简单的答案是将点向量更改为指向点的指针向量。像这样:

vector <std::shared_ptr<MyPoint>> vectorOfPoints;

for (int i = 0; i < 10 ; i++)
{
    vectorOfPoints.push_back(std::make_shared<MyPoint>(1,2,3));
}

现在您可以非常轻松地挑选想要传递给 myFace 构造函数的任何点。使用像 std::shared_ptr 这样的托管指针是一个全有或全无的提议。

,

如果我放类似的东西会怎样

class myFace
{
    public:

        // Constructor  
        myFace(int,vector<myPoint*>);

        // Destructor
        virtual  ~myFace(){};
       
         
    protected:

    private:
        int nPointsInFace_;
        vector<myPoint*> refToPointsThatMakeUpThisFace_;
  
};

在初始化 vectorOfPoints 之后。如果可以

std::vector<Point*> listOfPoints (4); 

listOfPoints[0] = vectorOfPoints[0]
listOfPoints[1] = vectorOfPoints[2]
listOfPoints[2] = vectorOfPoints[5]
listOfPoints[3] = vectorOfPoints[6]

Face myFace (4,listOfPoints);

这应该创建一个带有 vectorOfPoints 地址的人脸,不是吗? 更多的类会有vectorOfPoints的指针,使用shared_ptr是否有意义,对吗?