c++类中更多结构的复制构造函数
Copy constructor for more structures in class C++
我在做人们注册的程序。
我有类注册:
int personCount
int personSize
Person ** persons
Struct人
char * name
char * surname
Places ** oldPlaces // here is former residence of this person
和struct oldPlaces
char date[11]
char * street
char * city
在每个类/结构中,我都有分配空内存的构造函数和添加人或位置的add方法。
问题是如何实现复制构造函数?
我为注册设置了这个
CRegister::CRegister(const CRegister& b):personCount(b.personCount), personSize(b.personSize){
persons = new Person*[b.personSize];
personCount = 0;
personSize = b.personSize;
for (int i = 0; i < personSize; i++){
persons[i] = new Person();
persons[i].addPerson(b.persons[i]->id, b.persons[i]->name, b.persons[i]->surname);
}
但是我想复制oldPlaces…
谢谢你的建议
您还应该为Person
创建一个复制构造函数,并将其用于数组中的每个人。
for (int i = 0; i < personSize; i++)
persons[i] = new Person(*b.persons[i]);
并复制其中的位置:
Person::Person(const Person &b) {
...
// (Note that you will have to do a deep copy for the strings here as well)
oldPlaces = new Places *[oldPlacesCount];
for (int i = 0; i < oldPlacesCount; i++)
oldPlaces[i] = new Places(*b.oldPlaces[i]);
}
然后可能还为Places
等创建一个复制构造函数
编辑:是的,你需要添加oldPlacesCount
。
首先,如果使用的话,问题或多或少会自行解决std::string
和std::vector
。如果你坚持使用指针,你必须自己做一个深度拷贝赋值函数和析构函数)。在每个对象中,你都必须访问所有指针,"克隆"子对象。和您必须处理分配失败的情况可以将类型为Person
和Places
的对象留在不一致的状态。要做到这一点需要大量的代码,以及高度的c++专业知识。你不会想这么做的路线。(编写一个c++类,它有两个指向动态分配的内存可能非常复杂。使用shared_ptr
或scoped_ptr
使它简单得多,但仍然不像使用vector
和string
那么简单。)
编辑:
为了清楚地说明所涉及的内容,这里是需要的内容Place
,如果你不使用标准库:
struct Place
{
char date[11];
char* street;
char* city;
Place()
: street( NULL )
, city( NULL )
{
memset( date, ' ', sizeof( date ) );
}
Place( Place const& other )
: street( NULL )
, city( NULL )
{
memcpy( date, other.date, sizeof( date ) )
try {
street = new char[ strlen( other.street ) + 1 ];
strcpy( street, other.street );
city = new char[ strlen( other.city ) + 1 ];
strcpy( city, other.city );
} catch ( ... ) {
delete [] street;
delete [] city;
throw;
}
}
Place& operator=( Place const& other )
{
Place tmp( other );
memcpy( date, other.date, sizeof( date ) );
std::swap( street, other.street );
std::swap( city, other.city );
return *this;
}
~Place()
{
delete [] street;
delete [] city;
}
};
Person
更复杂,因为你必须这样做将整个数组oldPlaces
初始化为NULL
,然后初始化为复制到一个try块中,如果有任何错误,删除它们。
在实践中,任何有c++经验的人的第一件事如果由于某种原因他或她不能使用标准,他会怎么做库中,将实现一个(可能是简化的)版本std::string
和std::vector
,并使用它们。试块就像上面的复制构造函数一样,通常是一个指示程序员并不真正理解c++。所有像上面这样的代码中的分配和释放将被包装在一个更小、更原始的类,每个类最多只能管理一个动态分配的资源。因此,即使在保持非常跟你写的差不多,可能会有一个一个StringPtr
类,并在Person中使用它等。同样的,可以使用一个Person
数组和一个Place
数组,而不是指针数组。
我不知道你的结构被强加到什么程度你的老师,但这是不是在c++中编程的方式
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 复制构造函数、赋值运算符C++
- std::ofstream 作为类成员删除复制构造函数?
- 复制构造函数C++无法正确复制指针
- 关于复制构造函数的一个棘手问题
- 为什么调用复制构造函数而不是移动构造函数?
- 填充上编译器生成的复制构造函数之间的不一致
- C++ 对象指针数组的复制构造函数
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 防止在复制构造函数中隐式调用基构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 具有已删除移动和复制构造函数的类的就地构造
- 复制构造函数隐式转换问题
- 复制构造函数中的递归调用