【问题标题】:shared_ptr in c++, getting points to facesc ++中的shared_ptr,获取指向面孔的点
【发布时间】:2023-04-11 05:10:01
【问题描述】:

我有以下积分类:

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 的类来存储构成人脸的点的地址。

例如,

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

如何将具有上述条目地址的向量传递给 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_;
  
};

非常感谢您的帮助!

【问题讨论】:

  • 如果您希望使用std::shared_ptrmyFace 链接到点所在的std::vector&lt;Point&gt;,这不会发生。如果外部向量是std::vector&lt;std::shared_ptr&lt;Point&gt;&gt;,它当然可以(并且很容易)完成。
  • 您能举个例子吗?最初的方法实际上是将 std::vector 链接到 myFace
  • Jon 下面的回答正是描述了问题和解决方案。

标签: c++ c++11 pointers vector shared-ptr


【解决方案1】:

Face 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 点来说太过分了)。

您可以进行检查访问。

【讨论】:

  • 但是如果我改变一个点的坐标,脸上的值不会随着这个实现而改变,对吧?
  • 会的。脸上没有点,只有索引。
【解决方案2】:

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

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 这样的托管指针是一个孤注一掷的命题。

【讨论】:

  • 使用线程安全的智能指针来存储单个 3D 点是多余的,会影响性能。
  • 100% 同意@Acorn。总是冒着直接回答 SO 问题而不进行对话的风险。
【解决方案3】:

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

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有意义吧?

【讨论】:

  • 使用std::initializer_list 进行初始化,就像使用向量一样。
  • 在这种情况下 shared_ptr 会是一个不错的选择吗?
  • 智能指针总是比原始指针更好的选择。说,对于你想要实现什么,你应该提供一个接受 std::initializer_list 的构造函数
  • 在实际实践中,这将被放置在一个for循环中来存储地址。在那种情况下 std::initializer_list 有意义吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多