正在将指针复制到assign运算符中的另一个列表元素
Copying pointers to another list elements in assign operator
由于其中一个对象中的指针问题,我在想出如何在应用程序中设计复制对象的想法时遇到了一些问题。最简单的模式如下:
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
对象,我花了一段时间才发现这个错误。
正如我现在所理解的,当我将两个向量复制到新对象时,roads
到source
和destination
元素中的地址保持不变。因此,当旧对象被销毁时,roads
元素中的指针只指向垃圾。
您建议如何复制roads
矢量,使其元素指向新对象?
如果可以,请在Road
中使用Point
类型的对象,而不是Point*
类型的对象。
class Road
{
public:
Point source;
Point destination;
};
如果必须使用指针,请遵循"三条规则"。
此外,如果必须使用指针,请考虑使用智能指针std::shared_ptr
或std::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;
}
相关文章:
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 重载运算符*以获取对另一个类的实例的引用
- 使用 scope 运算符 (::) 引用另一个文件中的类
- 我重载了 << 和 = 运算符。为什么当我将一个对象分配给另一个对象并尝试打印它时,我会被打印出来?
- 包括来自另一个文件的运算符重载
- 为什么有条件编译运算符模板会更改另一个运算符的可用性?
- 转换运算符从一个模板类到另一个相关的模板类
- 运算符重载到另一个类
- 是否有必要重载具有另一个类 B 的数据成员的类 A 的赋值运算符和复制构造函数?
- 专用运算符<<模板类的模板类的另一个类
- 基于范围的循环使用另一个运算符
- 函数可以使用点运算符调用另一个功能
- C++重载运算符两次,一个返回非常量引用,另一个返回常量引用,首选项是什么
- 重载<运算符在另一个类中使用时"no matching function for call"错误
- 将一个向量(从向量的一个向量中提取)分配给另一个向量时出错,运算符为
- 在重载运算符中访问另一个类的数据成员
- 如何通过赋值运算符重载将一个列表复制到另一个列表上?C++
- 使用运算符"="将一个结构/类对象分配给另一个结构/类对象
- 正在将指针复制到assign运算符中的另一个列表元素