正在将指针复制到assign运算符中的另一个列表元素

Copying pointers to another list elements in assign operator

本文关键字:运算符 另一个 列表元素 assign 指针 复制      更新时间:2023-10-16

由于其中一个对象中的指针问题,我在想出如何在应用程序中设计复制对象的想法时遇到了一些问题。最简单的模式如下:

MyMapClass.h

class MyMapClass
{
    public:
        std::vector<Point> points;
        std::vector<Road> roads;
        MyMapClass& operator=(const MyMapClass&);
}

MyMapClass.cpp

MyMapClass& MyMapClass::operator=(const MyMapClass& m)
{
    points = m.points;
    roads = m.roads; // here is error
    return *this;
}

点.h

class Point
{
    public:
        std::string name;
        std::vector<float> position;
}

Road.h

class Road
{
    public:
        Point* source;
        Point* destination;
}

最初它的设计不需要复制MyMapClass对象,我花了一段时间才发现这个错误。

正如我现在所理解的,当我将两个向量复制到新对象时,roadssourcedestination元素中的地址保持不变。因此,当旧对象被销毁时,roads元素中的指针只指向垃圾。

您建议如何复制roads矢量,使其元素指向新对象?

如果可以,请在Road中使用Point类型的对象,而不是Point*类型的对象。

class Road
{
    public:
        Point source;
        Point destination;
};

如果必须使用指针,请遵循"三条规则"。

此外,如果必须使用指针,请考虑使用智能指针std::shared_ptrstd::unique_ptr,而不是原始指针。

只需为class Road创建一个复制构造函数。。。std::vector的复制赋值将调用每个元素的复制构造函数。。。。

class Road
{
    public:
        Point* source;
        Point* destination;
        Road(const Road& r) { /* implement copy operations of source and destination here */ }
}

然后这里的赋值将调用上面的复制构造函数来创建所有新元素

MyMapClass& MyMapClass::operator=(const MyMapClass& m)
{
    points = m.points;
    roads = m.roads; // invokes copy constructor m.roads.size() times
    return *this;
}
相关文章: