C++ 指向指针向量的指针的复制构造函数
C++ Copy constructor for a pointer to vector of pointers
我有一个类A
,它的成员有一个指向指针向量(current
)的指针,该向量包含一对整数和一个类B
的对象。我需要能够为类A
的对象创建副本,为此我使用Clone
函数(见下面的代码)。但是,当我使用此函数时,指针似乎指向相同的内存位置,而不是不同的内存位置。我认为解决这个问题是为我的类实现一个复制构造函数,以便能够正确复制我的对象,但我没有这样做。
以下是我的类的外观以及我实现复制构造函数的几次尝试:
class A {
public:
A();
A(const A &a);
~A();
A* Clone() {return new A(*this);}
std::vector<std::pair<unsigned int, B*>> *current;
};
编辑:构造函数和析构函数按如下方式实现:
A::A() {
current = new vector<std::pair<unsigned int, B*>>;
}
A::~A() {
std::vector<std::pair<unsigned int, B*>>::iterator cit = current->begin(), cend = current->end();
for (; cit != cend; ++cit) {
delete cit->second;
}
delete current;
}
选项#1:
A::A(const A &a){
*current = *a.current;
}
选项#2:
A::A(const A &a){
for(int i = 0; i < current->size(); i++) {
(*current)[i] = (*a.current)[i];
}
}
选项#3:
A::A(const A &a){
for(int i = 0; i < current->size(); i++) {
(*current)[i].first = (*a.current)[i].first;
(*current)[i].second = new B((*a.current)[i].second);
}
}
选项 #1 和 #2 给了我分段错误,而对于 #3,我得到错误:no match for operator *
哪种是实现复制构造函数的正确方法,我的Clone
函数是否应该以不同的方式实现?
构造函数根本不初始化current
成员。 在任何选项中。
从那里,访问其值(即名为current
的指针的值)会给出未定义的行为。 取消引用也是如此。 因此,所有选项(以及因此的变体)中*current
或*a.current
的用法都给出了未定义的行为。
如果您坚持成员current
必须是指针,则必须在所有构造函数中对其进行初始化。 例如,构造函数A::A()
(您尚未显示)必须如下所示
A::A() : current(new std::vector<std::pair<unsigned int, B*>>(0))
{
// initialised current with no elements
// add pairs to the vector
current->push_back(std::make_pair(0U, new B));
current->push_back(std::make_pair(42U, new B));
}
并且复制构造函数必须以类似于
A::A(const A &a) : current (new std::vector<std::pair<unsigned int, B *>>(a.current->size())
{
for(int i = 0; i < current->size(); i++)
{
(*current)[i].first = (*(a.current))[i].first;
(*current)[i].second = new B((*(a.current))[i].second);
}
}
然而,更一般地说,实际上没有理由将current
作为使用运算符new
创建的指针。 在这种情况下,构造函数可以简化为
A::A() : current(0)
{
// add pairs to the vector
current.push_back(std::make_pair(0U, new B));
current.push_back(std::make_pair(42U, new B));
}
和复制构造函数
A::A(const A &a) : current (a.current.size())
{
for(int i = 0; i < current.size(); i++)
{
current[i].first = a.current[i].first;
current[i].second = new B(a.current[i].second);
}
}
您也没有提供令人信服的信息来表明current
需要vector<pair<unsigned, B *>>
而不是vector<pair<unsigned, B>>
。 如果向量不需要保存指针(即它直接保存对象),那么实际上,您根本不需要定义复制构造函数 - 编译器生成的默认值就足够了。 而且您的代码根本不需要使用运算符new
(可能A::Clone()
除外)。
请注意,如果您确实需要手动滚动复制构造函数,则可能还需要手动滚动operator=()
和析构函数。 查找"三法则"(C++11 之前)或(C++11 及更高版本)"五法则"和"零法则"以获取更多信息。
- C++指针复制重载
- 将值从指针复制到常量对象参数
- 在 C++ 中通过字符串指针复制字符串变量中的字符串
- 使用指针复制构造函数用法
- 将对象的指针复制到此对象的新指针中
- 如何将指向 int(数组)的指针复制到 int 数组?
- 从指针复制对象
- C 使用指针复制char*
- 使用随机指针C 复制列表
- 如何在C++中从void指针复制数据
- 在 C++ 中将一个指针复制到另一个指针
- 正在将指针复制到assign运算符中的另一个列表元素
- 从压缩的DIB无效指针复制
- 无法从字符指针复制到短
- C++使用指针复制构造函数
- 将对象指针复制到动态对象数组中
- 在 CUDA 中使用指针复制类
- 从指针复制派生对象
- 如何使用智能指针复制C++更改指针
- 将内容从一个指针复制到另一个指针